gpt4 book ai didi

c# - 在 C# Web Api 中反序列化 JSON 对象时如何绑定(bind)给定属性?

转载 作者:太空狗 更新时间:2023-10-29 23:38:18 26 4
gpt4 key购买 nike

我有一个看起来像的c#类

public class Node {

public int Id { get; set; }

/** Properties omitted for sake of brevity **/

public Node ParentNode { get; set; }

}

我从浏览器中提交了一个 JSON 对象,如下所示

{"Id":1, "ParentNode":1}

其中分配给 ParentNode 属性的值 1 表示数据库标识符。因此,为了正确绑定(bind)到我的模型,我需要编写一个自定义 JSON 转换器

public class NodeJsonConverter : JsonConverter
{

public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
if (reader.TokenType == JsonToken.Null)
{
return null;
}

/** Load JSON from stream **/
JObject jObject = JObject.Load(reader);

Node node = new Node();

/** Populate object properties **/
serializer.Populate(jObject.CreateReader(), node);

return node;
}
}

因为我收到“Current JsonReader item is not an object: Integer.Path ParentNode'”,如何调整 ReadJson 方法以绑定(bind) ParentNode 属性或任何其他需要自定义转换的内容?

更新

我看过JsonPropertyAttribute其 API 文档说明

Instructs the JsonSerializer to always serialize the member with the specified name

但是,我如何以编程方式指示 JsonSerializer - 在我的例子中,在 ReadJson 方法中 - 使用给定的 JsonPropertyAttribute ?

http://www.newtonsoft.com/json/help/html/T_Newtonsoft_Json_JsonPropertyAttribute.htm

最佳答案

我认为这里的问题是,由于 Node 包含 ParentNode 属性形式的 Node,因此解析变得递归。

在调用 serializer.Populate(jObject.CreateReader(), node); 时,序列化程序将命中类型为 Node< 的 ParentNode 属性 然后它将尝试使用您的 NodeJsonConverter 解析它。那时读者已经继续前进,您不再有 StartObject,而是有一个 Integer。我想你可以检查 reader.TokenType 属性,看看你是在第一次调用还是后续调用中,并相应地处理它:

public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
if (reader.TokenType == JsonToken.Null)
{
return null;
}

Node node = new Node();

if (reader.TokenType == JsonToken.StartObject)
{
//initial call
//here we have the object so we can use Populate
JObject jObject = JObject.Load(reader);
serializer.Populate(jObject.CreateReader(), node);
}
else
{
//the subsequent call
//here we just have the int which is the ParentNode from the request
//we can assign that to the Id here as this node will be set as the
//ParentNode on the original node from the first call
node.Id = (int)(long)reader.Value;
}

return node;
}

关于c# - 在 C# Web Api 中反序列化 JSON 对象时如何绑定(bind)给定属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30196201/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com