如何在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
相关产品推荐
相关产品推荐

