C#反序列化未知JSON:处理termene字段类型不一致问题
解决JSON反序列化中字段时而为数组时而为对象/字符串的问题
针对公共Web服务返回JSON里termene字段类型不固定(时而数组、时而单个对象/字符串)导致的反序列化失败问题,用自定义JSON转换器就能解决,步骤如下:
1. 编写自定义JsonConverter
创建一个继承自JsonConverter<List<TermeneICCJ>>的转换器类,统一处理不同类型的输入:
public class TermeneConverter : JsonConverter<List<TermeneICCJ>> { public override List<TermeneICCJ> ReadJson(JsonReader reader, Type objectType, List<TermeneICCJ> existingValue, bool hasExistingValue, JsonSerializer serializer) { var result = new List<TermeneICCJ>(); // 处理数组类型的termene if (reader.TokenType == JsonToken.StartArray) { result = serializer.Deserialize<List<TermeneICCJ>>(reader); } // 处理单个对象类型的termene else if (reader.TokenType == JsonToken.StartObject) { var singleItem = serializer.Deserialize<TermeneICCJ>(reader); if (singleItem != null) { result.Add(singleItem); } } // 处理字符串类型的termene(如空字符串或无效值,直接返回空列表) else if (reader.TokenType == JsonToken.String) { // 若字符串是可解析的JSON,可自行添加解析逻辑;否则保持空列表 } return result; } public override void WriteJson(JsonWriter writer, List<TermeneICCJ> value, JsonSerializer serializer) { serializer.Serialize(writer, value); } }
2. 给termene字段绑定转换器
修改DosareICCJ类的termene字段,添加转换器标记:
public class DosareICCJ { // 其他字段保持不变... public List<PartiICCJ> parti { get; set; } [JsonConverter(typeof(TermeneConverter))] // 添加此行绑定转换器 public List<TermeneICCJ> termene { get; set; } public List<CaiAtacICCJ> caiAtac { get; set; } }
3. 保留原反序列化代码
你原来的请求和反序列化代码无需修改,直接运行即可:
List<DosareICCJ> result; var url = "some url that works"; var httpRequest = (HttpWebRequest)WebRequest.Create(url); var httpResponse = (HttpWebResponse)httpRequest.GetResponse(); var streamReader = new StreamReader(httpResponse.GetResponseStream()); var callresult = streamReader.ReadToEnd(); result = JsonConvert.DeserializeObject<List<DosareICCJ>>(callresult); return result;
这个转换器会自动适配termene字段的不同类型:数组直接转为列表,单个对象包装成列表,无效字符串则返回空列表,完全兼容Web服务的不稳定输出。
内容的提问来源于stack exchange,提问作者patru marian
相关产品推荐
相关产品推荐

