zoukankan      html  css  js  c++  java
  • Newtonsoft.Json忽略DataContract特性

     
     

    https://www.itsvse.com/forum.php?mod=viewthread&tid=4808

     
     
    Newtonsoft.Json 大家应该都知道,常用的json序列化和反序列化工具

    DataContractAttribute 指定该类型要定义或实现一个数据协定,并可由序列化程序(如 DataContractSerializer)进行序列化。 若要使其类型可序列化,类型作者必须为其类型定义数据协定。

    遇到一个难题,父类有[DataContract]特性,子类继承父类,子类所有的属性都需要加上[DataMember]特性,才能序列化和反序列化,由于父类是别人封装的dll,所以,无法删除父类的[DataContract]特性!

    测试如下,Test1类有[DataContract]特性,如果属性不加[DataMember]特性,会导致序列化和反序列化失败,如下图:

    <ignore_js_op>


    我们注释掉Test1类的[DataContract]特性,发现能正常序列化和反序列化,如下:

    <ignore_js_op>

    Newtonsoft.Json有没有什么高级的用法,可以忽略此特性呢?答案是有的!

    只需使用Json.Net的OptOut属性即可。它将优先于DataContract。

    1. [JsonObject(MemberSerialization.OptOut)]
    复制代码
    //
            //摘要:
            //所有公共成员都默认序列化。成员可以使用Newtonsoft.Json.JsonIgnoreAttribute排除
            //或System.NonSerializedAttribute。这是默认的成员序列化模式。
            OptOut = 0,
            //
            //摘要:
            //只有标有Newtonsoft.Json.JsonPropertyAttribute或System.Runtime.Serialization.DataMemberAttribute的成员
            //被序列化。此成员序列化模式也可以通过标记来设置
            / /类与System.Runtime.Serialization.DataContractAttribute。
            OptIn = 1,
            //
            //摘要:
            //所有公共和私人字段都被序列化。成员可以使用Newtonsoft.Json.JsonIgnoreAttribute排除
            //或System.NonSerializedAttribute。这个成员序列化模式也可以
            //通过用System.SerializableAttribute标记类并设置IgnoreSerializableAttribute来设置
            //将Newtonsoft.Json.Serialization.DefaultContractResolver设置为false。
            Fields = 2
    <ignore_js_op>

    测试代码:

    1. private const string jsonString = "{"Name":"http://www.itsvse.com","Sex":"男","Age":88}";
    2.         [DataContract]
    3.         [JsonObject(MemberSerialization.OptOut)]
    4.         public class Test1
    5.         {
    6.             public string Name { get; set; }
    7.             public string Sex { get; set; }
    8.             public int Age { get; set; }
    9.         }
    10.         private void button1_Click(object sender, EventArgs e)
    11.         {
    12.             Test1 t1 = JsonConvert.DeserializeObject<Test1>(jsonString);
    13.             Console.WriteLine(t1.Name);
    14.             Console.WriteLine(t1.Sex);
    15.             Console.WriteLine(t1.Age);
    16.             Console.WriteLine();
    17.             string json = JsonConvert.SerializeObject(new Test1() { Name = "哈哈", Sex = "女" });
    18.             Console.WriteLine(json);
    19.             
    20.         }
    复制代码


     
     
  • 相关阅读:
    TSQL--NESTED LOOPS JOIN
    TSQL--SORT MERGE JOIN
    TSQL--HASH JOIN
    Backup--备份相关的信息查看及小技巧
    java后台json如何传递到jsp中解析
    大数据资源
    oracle sql生成日历表
    easyUI中onLoadSuccess方法获取多个对象
    征信用户数据分析
    JS优秀资源站点收集
  • 原文地址:https://www.cnblogs.com/kelelipeng/p/13879672.html
Copyright © 2011-2022 走看看