zoukankan      html  css  js  c++  java
  • Json.Net学习(1) 实现简单的序列化和反序列化

    Attributes 可以用来控制Json.Net如何序列化和反序列化.Net对象。

    >JsonObjectAttribute--标记在类上,用于控制该类如何被序列化为一个Json对象(JSON Object)

    >JsonArrayAttribute--标记在集合上,用于控制该集合如何被序列化为一个Json集合(JSON Array)

    >JsonPropertyAttribute--标记在字段和属性上,用于控制它如何被序列化为一个Json对象中的属性

    >JsonConverterAttribute--标记在类或者字段和属性上,用于序列化时指定Json转换器(JsonConverter)

     这 里的MemberSerialization标记指定成员序列化为opt-in(每一个成员都必须标记JsonProperty或者DataMember attribute才被序列化)或者opt-out(默认情况下,除了被标记为JsonIgnoreAttribute的所有成员都将被序列化,这是 Json.Net 的默认行为)

      Json.Net把实现了IEnumerable接口的.Net类序列化为一个Json集合,用IEnumerable 的值来填充该集合。标记JsonPropertyAttribute来重写此行为,并强制序列化器序列化该类的字段和属性。

    ->JsonPropertyAttribute

      JsonPropertyAttribute有很多用途

        1.默认情况下,Json 属性与.Net属性有相同的名字,这个attribute允许自定义属性名

        2.当member serialization 被设置成opt-in时,指定属性应该被序列化

        3.在序列化和反序列化时包含非public属性

    ->JsonIgnoreAttribute

      从序列化中排除指定的字段或者属性

    ->JsonConverterAttribute

      JsonConverterAttribute指定Json序列化器(JsonSerializer)用来转换一个对象

      这个特性可以用来标记类或者成员,当它用来标记类的时候,由attribute指定的JsonConverter将为类提供默认的序列化方法.当它用来标记字段或者属性的时候,指定的JsonConverter将一直用于序列化该值。

      使用JsonConverter的优先级顺序为:先成员,后类,最后为传给JsonSerializer的任何转换器.

       [JsonObject(MemberSerialization.OptIn)]
        public class Person
        {
            [JsonProperty("CustomeName")]
             public string Name { get; set; }
            [JsonProperty]
            public string Sex { get; set; }
            [JsonProperty]
            //[JsonConverter(typeof(IsoDateTimeConverter))]
            //[JsonConverter(typeof(JavaScriptDateTimeConverter))]
            public DateTime Birthday { get; set; }
        }
     string strJson = JsonConvert.SerializeObject(c, Formatting.Indented);

    上面的[JsonProperty("CustomeName")]把Name属性重新命名为:CustomeName,Person类的JsonObject标签的值为MemberSerialization.OptIn,它要求必须显示声明需要序列化的元素.

    如果我们不使用属性标签的话也就是这样:

    public class Person
        {
            public string Name { get; set; }
            public string Sex { get; set; }
            public DateTime Birthday { get; set; }
        }

    这相当于设置了[JsonObject(MemberSerialization.OptOut)].此时就会执行Json.Net的默认行为,除了被标记为JsonIgnoreAttribute的所有成员都将被序列化.

    序列化的结果如下:

    {
      "Name": "TestName",
      "Sex": "Male",
      "Birthday": "2013-07-22T21:41:31.4630318+08:00"
    }
  • 相关阅读:
    AGC030 简要题解
    CF1601 简要题解
    CSP2021 题解
    2021.11.1-2021.11.7总结
    超快速梅森旋转SFMT(SIMD-oriented Fast Mersenne Twister)一览
    2021.10.25-2021.10.31总结
    CSP 2021 游记
    在Windows vs2015环境下编译使用Libevent
    在Windows环境下实现一个简单的libevent服务器
    Thinking in C++ 课后习题自己实现 第二章
  • 原文地址:https://www.cnblogs.com/lenther2002/p/4725396.html
Copyright © 2011-2022 走看看