如何用一个Output类处理API返回的两种不同结构响应?
用同一类兼容两种JSON响应的解决方案
要解决API返回两种不同格式info字段的反序列化问题,核心是通过自定义Json转换器动态处理对象和数组两种结构,具体步骤如下:
1. 定义自定义Json转换器
创建继承自JsonConverter<List<string>>的转换器,在反序列化时判断当前JSON节点类型,分别处理对象和数组场景:
public class InfoConverter : JsonConverter<List<string>> { public override List<string> ReadJson(JsonReader reader, Type objectType, List<string> existingValue, bool hasExistingValue, JsonSerializer serializer) { var infoList = new List<string>(); // 处理info为JSON对象的情况 if (reader.TokenType == JsonToken.StartObject) { var infoObj = JObject.Load(reader); // 可根据需求提取字段,比如提取number字段转为字符串加入列表 var numberStr = infoObj["number"]?.ToString(); if (!string.IsNullOrEmpty(numberStr)) { infoList.Add(numberStr); } // 若需要将整个对象转为JSON字符串存入列表,替换为: // infoList.Add(infoObj.ToString(Formatting.None)); } // 处理info为字符串数组的情况 else if (reader.TokenType == JsonToken.StartArray) { infoList = serializer.Deserialize<List<string>>(reader); } return infoList; } public override void WriteJson(JsonWriter writer, List<string> value, JsonSerializer serializer) { // 序列化时默认输出为数组,可根据需求调整逻辑 serializer.Serialize(writer, value); } }
2. 在Output类中应用转换器
在Info属性上标记[JsonConverter]特性,指定使用上述自定义转换器:
public class Output { [JsonConverter(typeof(InfoConverter))] public List<string> Info { get; set; } }
3. 反序列化测试
针对两种响应格式,均可正常反序列化为Output类:
// 响应1(info为对象) var response1 = "{\"info\": {\"id\": \"001\", \"number\": \"9527\"}}"; var output1 = JsonConvert.DeserializeObject<Output>(response1); // output1.Info = ["9527"](或自定义处理后的内容) // 响应2(info为字符串数组) var response2 = "{\"info\": [\"user1\", \"user2\", \"user3\"]}"; var output2 = JsonConvert.DeserializeObject<Output>(response2); // output2.Info = ["user1", "user2", "user3"]
注意事项
- 转换器中的对象处理逻辑可根据实际需求调整,比如提取多个字段拼接成字符串、保留整个对象的JSON格式等。
- 若不需要支持序列化,
WriteJson方法可留空或抛出NotImplementedException,但建议实现基础序列化逻辑保证双向兼容性。
内容的提问来源于stack exchange,提问作者Akshay Malvankar
相关产品推荐
相关产品推荐

