json.net可以说是.net平台最好的json序列化类库了。
在使用的过程中,我遇到了这个问题,比如说List< T >中,如果是T的子类U,依然会被反序列化成T的,所以我需要自己定义序列化方法,在json.net中,只要继承JsonConvert类就可以了,
public class convert : JsonConverter
我们需要重写3个方法
public class convert : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return true;
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
return null;
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
}
}
第一 Canconvert这个就是判断传入的类型能否转换,不多说了
第二个 ReadJson方法,它会传入一个JSonReader参数,有了它,我们就可以自已解析json了,它有
if (reader.TokenType != JsonToken.StartObject) throw new Exception("json 格式有误");
// Token,英文符的意思,就是当前这个位置,它是什么,是json中的对象开始标志{,对象结束标志},还是数组开始[,或者是属性,这是它表达的意思。
public enum JsonToken
{
None,
StartObject,
StartArray,
StartConstructor,
PropertyName,
Comment,
Raw,
Integer,
Float,
String,
Boolean,
Null,
Undefined,
EndObject,
EndArray,
EndConstructor,
Date,
Bytes,
}
token处的值
reader.Value
token处的值,但是{,或者},或者[ ,或者]的token的值是null,而JsonToken.PropertyName这种token是有值的,比如{“name”:”zt”}
如果读到第二个token,reader.Value 就是“name”,通过read方法向前读,每一次read都会向前进一步,读到下一个token,
read方法
if (reader.TokenType != JsonToken.StartObject)
reader.Read();
//读取下一个token
有了reader,我们就可以自己处理json数据了,但是注意,reader.Read()函数会返回bool值,我们必须要一直读取到它返回false为止,不然json.net会抛出异常。