zoukankan      html  css  js  c++  java
  • Json.Net学习笔记(五) 自定义Json序列化特性

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

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

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

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

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

     和使用内置的Json.Net attributes一样,当确定Json如何被序列化和反序列化时,Json.Net也查找DataContract和DataMember attributes。如果都存在,Json.Net 序列化特性将优先使用。

    示例:


       [JsonObject(MemberSerialization.OptOut)]
        public class Person
        {
            // "John Smith"
            [JsonProperty]
            public string Name { get; set; }
            // "2000-12-15T22:11:03"
            [JsonProperty]
            [JsonConverter(typeof(IsoDateTimeConverter))]
            public DateTime BirthDate { get; set; }
            // new Date(976918263055)
            [JsonProperty]
            [JsonConverter(typeof(JavaScriptDateTimeConverter))]
            public DateTime LastModified { get; set; }
            // not serialized
            public string Department { get; set; }
        }
    ->JsonObjectAttribute
      这里的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的任何转换器.
    示例:
        public class MemberConverterClass
        {
            public DateTime DefaultConverter { get; set; }
            [JsonConverter(typeof(IsoDateTimeConverter))]
            public DateTime MemberConverter { get; set; }
        }//注:这是一个JsonConverterAttribute 应用于属性的例子
    测试:
     DateTime date = Convert.ToDateTime("1970-01-01T00:00:00Z").ToUniversalTime();
                MemberConverterClass c = new MemberConverterClass
                {
                    DefaultConverter = date,
                    MemberConverter = date
                };
                string json = JsonConvert.SerializeObject(c, Formatting.Indented);
                Console.WriteLine(json);
    输出结果:
    {
      "DefaultConverter": "\/Date(0)\/",
      "MemberConverter": "1970-01-01T00:00:00Z"
    }
  • 相关阅读:
    nohub和 2>&1 &
    postman
    ximd 破解版
    B树和B+树的插入、删除图文详解
    漫画叙述B+树和B-树,很值得看!
    数据库 操作的几个问题记录
    推送实现 应用未启动情况下的自定义声音播放
    collectionView reloadData时 点击问题
    强制横屏或者竖屏
    wkWebView 或者 webView 在客户端隐藏某些布局的方法
  • 原文地址:https://www.cnblogs.com/aaa6818162/p/2251118.html
Copyright © 2011-2022 走看看