gpt4 book ai didi

c# - 反序列化对象的JSON数组,但是当数组包含1个对象时,数组被省略

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

我正在使用 .NET Core 的 api,它返回对象数组。但是当数组只包含一个对象时,外部API会移除数组,直接粘贴对象。

我希望有一个不需要我使用 JObjects 或覆盖 JsonConverter 的属性或设置。

我正在处理的示例 JSON:

{
"a": {
"b": [{
"id": 1,
"name": "first object"
}, {
"id": 2,
"name": "second object"
}]
}
}

带省略数组的Json

{
"a": {
"b": {
"id": 1,
"name": "One object only"
}
}
}

这就是我正在做的(简化)

public class Response
{
public A a { get; set; }
}

public class A
{
public List<B> b { get; set; }
}

public class B
{
public int id { get; set; }
public string name { get; set; }
}

var apiResponse = await response.Content.ReadAsAsync<Response>()

我希望有可能在返回第二个 JSON 示例时,ReadAsAsync() 会自动理解它应该被转换为一个包含一个对象 B 的数组。

问题是这可能发生在 API 响应的许多地方。

最佳答案

您可以创建一个自定义 JsonConverter 来检查您处理的是数组还是单个对象。以下示例显示了一个转换为 List<T> 的转换器:

public class ArrayJsonConverter<T> : JsonConverter<List<T>>
{
public override List<T> ReadJson(JsonReader reader, Type objectType, List<T> existingValue, bool hasExistingValue, JsonSerializer serializer)
{
if (reader.TokenType == JsonToken.StartObject)
{
var jObj = JObject.Load(reader);
var obj = jObj.ToObject<T>();
var lst = new List<T>();
lst.Add(obj);
return lst;
}
else if (reader.TokenType == JsonToken.StartArray)
{
var jArray = JArray.Load(reader);
return jArray.ToObject<IEnumerable<T>>().ToList();
}
throw new InvalidOperationException();
}

public override void WriteJson(JsonWriter writer, List<T> value, JsonSerializer serializer)
{
throw new NotImplementedException();
}
}

转换器首先检查读取器是定位在一个对象还是一个数组。根据这一点,它要么创建一个只有一个对象的列表,要么读取数组。
为了使用它,您可以使用 JsonConverter 标记属性。属性,例如:

public class A
{
[JsonConverter(typeof(ArrayJsonConverter<B>))]
public List<B> b { get; set; }
}

关于c# - 反序列化对象的JSON数组,但是当数组包含1个对象时,数组被省略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54711356/

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