第三方API返回混合类型字段的C# Json反序列化问题
解决方案:处理JSON中字段类型不一致的反序列化问题
方案一:自定义JsonConverter(推荐)
这种方法能优雅统一两种类型的映射逻辑,是最可靠的解决方案。
- 实现自定义转换器,处理空对象与字符串的转换逻辑:
public class StringOrEmptyObjectConverter : JsonConverter<string> { public override string ReadJson(JsonReader reader, Type objectType, string existingValue, bool hasExistingValue, JsonSerializer serializer) { if (reader.TokenType == JsonToken.String) { return (string)reader.Value; } else if (reader.TokenType == JsonToken.StartObject) { // 跳过空对象的解析流程 serializer.Deserialize(reader, typeof(object)); return null; // 可根据业务需求改为返回空字符串"" } return null; } public override void WriteJson(JsonWriter writer, string value, JsonSerializer serializer) { writer.WriteValue(value); } }
- 修改CustomClass,为contact字段添加转换器特性:
public class CustomClass { public string name; [JsonConverter(typeof(StringOrEmptyObjectConverter))] public string contact; }
- 反序列化代码保持原有逻辑即可正常执行:
public List<CustomClass> ReadAndDeserialIntoObject(string filePath) { var objSer = JsonConvert.DeserializeObject<List<CustomClass>>(File.ReadAllText(filePath)); Console.WriteLine(objSer); return objSer; }
处理后,JSON中的空对象{}会被转为null(或自定义的空字符串),字符串类型则直接保留原值,反序列化流程不会再报错。
方案二:用object类型接收后处理(临时快速方案)
如果不想编写转换器,可先用object类型接收字段,再在后续逻辑中统一处理:
- 定义CustomClass:
public class CustomClass { public string name; public object contact; }
- 反序列化后对contact字段做类型判断与转换:
public List<CustomClass> ReadAndDeserialIntoObject(string filePath) { var objList = JsonConvert.DeserializeObject<List<CustomClass>>(File.ReadAllText(filePath)); foreach (var obj in objList) { if (obj.contact is JObject) { obj.contact = null; // 或转换为空字符串 } } Console.WriteLine(objList); return objList; }
这种方法适合临时场景,但会增加业务逻辑的耦合度,长期维护推荐使用方案一。
内容的提问来源于stack exchange,提问作者user16778385
相关产品推荐
相关产品推荐

