C#中处理API返回attachments字段数组/对象不一致问题求助
处理API响应中attachments时而为数组时而为对象的问题
外部API返回的attachments字段类型不一致(有时是数组、有时是单个对象),导致C#实体类反序列化时报错,这是第三方API常见的不规范返回问题,以下是两种主流序列化库的解决办法:
使用Newtonsoft.Json(Json.NET)解决
- 自定义JSON转换器,处理对象/数组的兼容转换:
using Newtonsoft.Json; using Newtonsoft.Json.Linq; using System; using System.Collections.Generic; public class AttachmentsConverter : JsonConverter<List<Attachments>> { public override List<Attachments> ReadJson(JsonReader reader, Type objectType, List<Attachments> existingValue, bool hasExistingValue, JsonSerializer serializer) { var token = JToken.Load(reader); if (token.Type == JTokenType.Object) { // 单个对象转为包含该对象的列表 var attachment = token.ToObject<Attachments>(); return new List<Attachments> { attachment }; } else if (token.Type == JTokenType.Array) { // 正常反序列化为列表 return token.ToObject<List<Attachments>>(); } return new List<Attachments>(); } public override void WriteJson(JsonWriter writer, List<Attachments> value, JsonSerializer serializer) { // 序列化时如果列表只有一个元素,转为单个对象(可选,根据需求调整) if (value.Count == 1) { serializer.Serialize(writer, value[0]); } else { serializer.Serialize(writer, value); } } }
- 在实体类的
attachments属性上添加转换器特性:
public class Attachments { public string idAttachment { get; set; } public string attachmentPath { get; set; } } public class Root { public string emplooye { get; set; } public string age { get; set; } [JsonConverter(typeof(AttachmentsConverter))] public List<Attachments> attachments { get; set; } = new List<Attachments>(); }
使用System.Text.Json解决(.NET Core/.NET 5+)
- 自定义JSON转换器:
using System; using System.Collections.Generic; using System.Text.Json; using System.Text.Json.Serialization; public class AttachmentsSystemTextJsonConverter : JsonConverter<List<Attachments>> { public override List<Attachments> Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { if (reader.TokenType == JsonTokenType.StartObject) { var attachment = JsonSerializer.Deserialize<Attachments>(ref reader, options); return new List<Attachments> { attachment }; } else if (reader.TokenType == JsonTokenType.StartArray) { return JsonSerializer.Deserialize<List<Attachments>>(ref reader, options); } return new List<Attachments>(); } public override void Write(Utf8JsonWriter writer, List<Attachments> value, JsonSerializerOptions options) { if (value.Count == 1) { JsonSerializer.Serialize(writer, value[0], options); } else { JsonSerializer.Serialize(writer, value, options); } } }
- 修改实体类属性:
public class Attachments { public string idAttachment { get; set; } public string attachmentPath { get; set; } } public class Root { public string emplooye { get; set; } public string age { get; set; } [JsonConverter(typeof(AttachmentsSystemTextJsonConverter))] public List<Attachments> attachments { get; set; } = new List<Attachments>(); }
内容的提问来源于stack exchange,提问作者Matheus E
相关产品推荐
相关产品推荐

