You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C#中反序列化有时被封装的JSON数组

解决API返回格式不一致的反序列化问题

API返回存在两种格式:

  • 当有数据时,直接返回JSON数组:
[
  {
    "id": 324,
    "name": "John Doe"
  },
  {
    "id": 123,
    "name": "Jane Doe"
  }
]
  • 当无数据时,返回包含空数组的对象,数组键名为"data":
{ "data": [] }

要实现自动适配这两种格式,可通过自定义Json转换器处理,同时注意修正Person类的字段类型错误(Name字段应为string而非int)。

步骤1:修正Person类

public class Person
{
    [JsonProperty(PropertyName = "id")]
    public int Id { get; set; }
    
    [JsonProperty(PropertyName = "name")]
    public string Name { get; set; } // 原代码写成int会导致反序列化失败
}

步骤2:实现自定义JsonConverter

该转换器会自动判断返回的JSON是数组还是对象,针对对象场景提取"data"字段的数组内容:

public class FlexibleArrayConverter : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        // 仅处理数组类型
        return objectType.IsArray;
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        var element = JToken.Load(reader);
        // 是数组则直接反序列化
        if (element.Type == JTokenType.Array)
        {
            return element.ToObject(objectType, serializer);
        }
        // 是对象则尝试读取"data"字段对应的数组
        else if (element.Type == JTokenType.Object)
        {
            var dataToken = element["data"];
            return dataToken?.ToObject(objectType, serializer) ?? Activator.CreateInstance(objectType);
        }
        // 其他情况返回空数组
        return Activator.CreateInstance(objectType);
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        // 序列化时沿用默认逻辑
        serializer.Serialize(writer, value);
    }
}

步骤3:使用转换器进行反序列化

调用JsonConvert.DeserializeObject时传入自定义转换器即可:

var settings = new JsonSerializerSettings();
settings.Converters.Add(new FlexibleArrayConverter());

Person[] persons = JsonConvert.DeserializeObject<Person[]>(x.Result, settings);

也可以直接在数组类型上标记特性,省去每次传参数的步骤:

[JsonConverter(typeof(FlexibleArrayConverter))]
public class PersonArray : Person[] { }

// 调用时直接使用PersonArray类型
PersonArray persons = JsonConvert.DeserializeObject<PersonArray>(x.Result);

这样就能同时兼容两种返回格式,自动完成解包和数组转换。

内容的提问来源于stack exchange,提问作者MPelletier

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 20:55:25