Json数据字段类型兼容性处理
今天上班后遇到这样一档子事,web那边要重构,把以前的老接口改造的新接口上。心里想着,改就改呗。然后他说有些字段的类型要改一下。当时我就蒙了,你这改的话,我相关的数据的引用是不是都要跟着改一下。本能的排斥让我想着看着有没有更好的办法去解决这个问题。结果还真有。下面是我的解决方案。
通过继承JsonConverter来解决
我使用的json解析工具是Newtonsoft.该库给我提供了一个JsonConverter让我对字段的解析自定义。比如一些字段我定义的是long类型,json确是字符串类型。这时候我需要定义一个属性兼容类StringToNumberConverter去兼容它。具体的实现方法如下:
public class StringToNumberConverter : JsonConverter{public override bool CanConvert(Type objectType){return objectType == typeof(long)||objectType == typeof(int);}public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer){switch (reader.TokenType){case JsonToken.Integer:case JsonToken.Float:return (long)reader.Value;case JsonToken.String:return long.Parse(reader.Value.ToString());case JsonToken.Null:return null;default:throw new JsonSerializationException($"Unexpected token type: {reader.TokenType}");}}public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer){writer.WriteValue(value);}}
具体使用
我定义了一个类A
public class A
{public long a;
}
我需要把json {"a","1232456"},转化成这个对象
通过在字段A添加属性[JsonConverter(typeof(NewAPI.NumberToStringConverter))]
public class A
{[JsonConverter(typeof(NewAPI.StringToNumberConverter))]public long a;
}
这样的话,就完美解析。完事儿。