gpt4 book ai didi

JSON.NET 反序列化对象/对象数组中的对象

转载 作者:行者123 更新时间:2023-12-02 09:13:32 25 4
gpt4 key购买 nike

我遇到的情况是,我使用的 API 返回不一致的 JSON,我想使用 JSON.NET 对其进行反序列化。在一种情况下,它返回一个包含对象的对象(注意外面的“1”可以是任何数字):

{
"1":{
"0":{
"db_id":"12835424",
"title":"XXX"
},
"1":{
"db_id":"12768978",
"title":"YYY"
},
"2":{
"db_id":"12768980",
"title":"ZZZ"
},
"3":{
"db_id":"12768981",
"title":"PPP"
}
}
}

在另一种情况下,它返回一个对象数组:

{
"3":[
{
"db_id":"12769199",
"title":"XXX"
},
{
"db_id":"12769200",
"title":"YYY"
},
{
"db_id":"12769202",
"title":"ZZZ"
},
{
"db_id":"12769243",
"title":"PPP"
}
]
}

我不知道为什么会存在这种不一致,但这是我正在使用的格式。使用 JsonConvert.DeserializeObject 方法反序列化两种格式的正确方法是什么?

最佳答案

对于当前版本的 Json.NET(Json.NET 4.5 Release 11),这里有一个 CustomCreationConverter,它将处理有时反序列化为对象、有时反序列化为数组的 Json。

public class ObjectToArrayConverter<T> : CustomCreationConverter<List<T>> where T : new() 
{
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
List<T> target = new List<T>();

try
{
// Load JObject from stream
JArray jArray = JArray.Load(reader);

// Populate the object properties
serializer.Populate(jArray.CreateReader(), target);
}
catch (JsonReaderException)
{
// Handle case when object is not an array...

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

// Create target object based on JObject
T t = new T();

// Populate the object properties
serializer.Populate(jObject.CreateReader(), t);

target.Add(t);
}

return target;
}

public override List<T> Create(Type objectType)
{
return new List<T>();
}
}

用法示例:

[JsonObject]
public class Project
{
[JsonProperty]
public string id { get; set; }

// The Json for this property sometimes comes in as an array of task objects,
// and sometimes it is just a single task object.
[JsonProperty]
[JsonConverter(typeof(ObjectToArrayConverter<Task>))]
public List<Task> tasks{ get; set; }
}

[JsonObject]
public class Task
{
[JsonProperty]
public string name { get; set; }

[JsonProperty]
public DateTime due { get; set; }
}

关于JSON.NET 反序列化对象/对象数组中的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10869314/

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