Newtonsoft.Json忽略DataContract特性

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>
  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.         }
复制代码