newtonjson.net JsonConverter 的使用自定义序列化某个类(一)

来源:互联网 发布:全民淘宝权 编辑:程序博客网 时间:2024/06/13 20:32

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会抛出异常。

阅读全文
0 0
原创粉丝点击