如何将JSON中格式多变的data字段统一反序列化为字符串?
解决JSON反序列化时
data字段类型不一致的问题 要把服务端返回的data字段统一序列化为字符串,不管它原本是字符串还是JSON对象,你可以给Newtonsoft.Json编写一个自定义Json转换器,让它在反序列化时自动把对象转成JSON字符串,字符串则直接保留。
步骤1:创建自定义Json转换器
写一个继承自JsonConverter<string>的转换器类,重写ReadJson方法处理两种类型的输入:
public class FlexibleStringConverter : JsonConverter<string> { public override string ReadJson(JsonReader reader, Type objectType, string existingValue, bool hasExistingValue, JsonSerializer serializer) { // 处理字符串类型的data if (reader.TokenType == JsonToken.String) { return (string)reader.Value; } // 处理JSON对象类型的data:把对象序列回JSON字符串 else if (reader.TokenType == JsonToken.StartObject) { var jObj = JObject.Load(reader); return jObj.ToString(Formatting.None); } // 其他类型(如数字、数组)可按需处理,此处默认返回空字符串 return string.Empty; } public override void WriteJson(JsonWriter writer, string value, JsonSerializer serializer) { // 序列化时可尝试将字符串解析为对象输出,解析失败则直接输出原字符串 try { var jObj = JObject.Parse(value); jObj.WriteTo(writer); } catch { writer.WriteValue(value); } } }
步骤2:给类A的data字段添加转换器特性
修改你的类A,在data属性上标记[JsonConverter]特性,指定自定义转换器:
public class A { [JsonConverter(typeof(FlexibleStringConverter))] public string data { get; set; } }
步骤3:正常执行反序列化
现在不管服务端返回的data是字符串还是JSON对象,都能正确转成字符串:
// 测试字符串类型的data var json1 = "{\"data\": \"Ball\"}"; var a1 = JsonConvert.DeserializeObject<A>(json1); // a1.data 的值为 "Ball" // 测试对象类型的data var json2 = "{\"data\": {\"field1\": \"Ball\", \"field2\": \"Foo\"}}"; var a2 = JsonConvert.DeserializeObject<A>(json2); // a2.data 的值为 "{\"field1\":\"Ball\",\"field2\":\"Foo\"}"
这样就能完美解决服务端返回data字段类型不一致导致的反序列化失败问题。
内容的提问来源于stack exchange,提问作者Daniel
相关产品推荐
相关产品推荐

