gpt4 book ai didi

c# - 反序列化具有不同数据结构的 JSON

转载 作者:行者123 更新时间:2023-11-30 22:03:49 25 4
gpt4 key购买 nike

我正在使用的一个 JSON API 返回的响应会根据查询返回的结果数量而改变其数据结构。我从 C# 中使用它并使用 JSON.NET 反序列化响应。

这是从 API 返回的 JSON

多结果响应:

{
"response": {
"result": {
"Leads": {
"row": [
{
"no": "1",
...
...
...

单一结果响应:

{
"response": {
"result": {
"Leads": {
"row": {
"no": "1",
...
...
...

请注意“行”节点的区别,在多个结果的情况下是数组,在单个结果的情况下是对象。

这是我用来反序列化这些数据的类

类:

public class ZohoLeadResponseRootJson
{
public ZohoLeadResponseJson Response { get; set; }
}

public class ZohoLeadResponseJson
{
public ZohoLeadResultJson Result { get; set; }
}

public class ZohoLeadResultJson
{
public ZohoDataMultiRowJson Leads { get; set; }
}

public class ZohoDataMultiRowJson
{
public List<ZohoDataRowJson> Row { get; set; }
}

public class ZohoDataRowJson
{
public int No { get; set; }
...
}

“多结果响应”反序列化没有问题,但是当响应中只有一个结果时,由于数据结构的变化,无法反序列化响应。我得到一个异常(exception)

Newtonsoft.Json.JsonSerializationException: Cannot deserialize the current JSON 
object (e.g. {"name":"value"}) into type
'System.Collections.Generic.List`1[MyNamespace.ZohoDataRowJson]'
because the type requires a JSON array (e.g. [1,2,3]) to deserialize correctly.

To fix this error either change the JSON to a JSON array (e.g. [1,2,3])
or change the deserialized type so that it is a normal .NET type (e.g. not a
primitive type like integer, not a collection type like an array or List<T>)
that can be deserialized from a JSON object. JsonObjectAttribute can also be
added to the type to force it to deserialize from a JSON object.

Path 'response.result.Notes.row.no', line 1, position 44.

有没有一种方法可以在 Json.Net 中使用某些属性来处理这个问题,并且希望不必编写转换器?

最佳答案

灵感来自 answer类似的问题。

public class ZohoDataMultiRowJson
{
[JsonConverter(typeof(ArrayOrObjectConverter<ZohoDataRowJson>))]
public List<ZohoDataRowJson> Row { get; set; }
}

public class ArrayOrObjectConverter<T> : JsonConverter
{
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
throw new NotImplementedException();
}

public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
if (reader.TokenType == JsonToken.StartArray)
{
return serializer.Deserialize<List<T>>(reader);
}
else if (reader.TokenType == JsonToken.StartObject)
{
return new List<T>
{
(T) serializer.Deserialize<T>(reader)
};
}
else
{
throw new NotSupportedException("Unexpected JSON to deserialize");
}
}

public override bool CanConvert(Type objectType)
{
throw new NotImplementedException();
}
}

关于c# - 反序列化具有不同数据结构的 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25731858/

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