今天上班后遇到这样一档子事,web那边要重构,把以前的老接口改造的新接口上。心里想着,改就改呗。然后他说有些字段的类型要改一下。当时我就蒙了,你这改的话,我相关的数据的引用是不是都要跟着改一下。本能的排斥让我想着看着有没有更好的办法去解决这个问题。结果还真有。下面是我的解决方案。
通过继承JsonConverter来解决
我使用的json解析工具是Newtonsoft.该库给我提供了一个JsonConverter让我对字段的解析自定义。比如一些字段我定义的是long类型,json确是字符串类型。这时候我需要定义一个属性兼容类StringToNumberConverter去兼容它。具体的实现方法如下:
cs
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
cs
public class A
{
public long a;
}
我需要把json {"a","1232456"},转化成这个对象
通过在字段A添加属性[JsonConverter(typeof(NewAPI.NumberToStringConverter))]
cs
public class A
{
[JsonConverter(typeof(NewAPI.StringToNumberConverter))]
public long a;
}
这样的话,就完美解析。完事儿。