JsonIgnore不适用于MemberSerialization.Serialization中的字段

时间:2019-04-25 14:59:55

标签: c# serialization json.net

我正在尝试通过使用MemberSerialization枚举中的字段来使用Newtonsoft.Json序列化对象。

这是添加[JsonObject(MemberSerialization.Fields)]的类:

 [JsonObject(MemberSerialization.Fields)] 
        public class Employee {
            [JsonIgnore]
            public int ID { get; set; }
            [JsonProperty]
            public string Name { get; set; } 
            public char Gender { get; set; }
            [JsonProperty]
            public string WorkPhone { get; set; }
            private string Address { get; set; }
            [JsonProperty]
            public List<string> Skills { get; set; }         
        }

//主要部分:

Employee e1 = new Employee() {
                ID = 1,
                Name = "Igor",
                Gender = 'M',
                WorkPhone = "78123456",
                Skills = new List<string>() { "C#", "SQL Server" }
            };

    string json = JsonConvert.SerializeObject(employees, Formatting.Indented);
                string path = @"..\JsonSerialization.json";
                File.WriteAllText(path, json);

序列化会产生意外的输出:

[
  {
    "<ID>k__BackingField": 1,
    "<Name>k__BackingField": "Igor",
    "<Gender>k__BackingField": "M",
    "<WorkPhone>k__BackingField": "78123456",
    "<Address>k__BackingField": "ul. Partizanski odredi, Skopje",
    "<Skills>k__BackingField": [
      "C#",
      "SQL Server"
    ]
  } 
]

如果我评论class属性

//[JsonObject(MemberSerialization.Fields)] 

然后该功能起作用。 有什么想法,为什么呢?我在Newtonsoft.Json文档中找不到它。

但是,JsonIgnore属性可以与

一起正常工作
[JsonObject(MemberSerialization.OptOut)] 
and
[JsonObject(MemberSerialization.OptIn)] 

2 个答案:

答案 0 :(得分:2)

当您使用自动属性(即{ get; set; })时,“编译器会创建一个私有的匿名后备字段,只能通过属性的get和set访问器进行访问” { {3}}

您在这里看到的是那些私有支持字段,就像(docs)的文档所说的那样-所有公共和私有字段都已序列化。

由于您所有的属性都是公开的,并且您的课程中没有任何字段,所以为什么仍要设置该值?

答案 1 :(得分:0)

即使我具有字段和自动属性,我也希望只有这些字段才能被序列化。但是,也有自动属性。只是尝试过,我们不希望序列化文件中有任何属性数据。现在很清楚为什么有k__BackingField了。谢谢!