首页 > 解决方案 > JsonIgnore 不适用于序列化中的 MemberSerialization.Fields

问题描述

我正在尝试通过使用 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"
    ]
  } 
]

如果我评论类属性

//[JsonObject(MemberSerialization.Fields)] 

然后该功能起作用。对此有任何想法,为什么会这样?我在 Newtonsoft.Json 文档中找不到它。

但是,JsonIgnore 属性适用于

[JsonObject(MemberSerialization.OptOut)] 
and
[JsonObject(MemberSerialization.OptIn)] 

标签: c#serializationjson.net

解决方案


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

您在这里看到的是那些私有支持字段,正如MemberSerialization.Fields的文档所说 - 所有公共和私有字段都是序列化的。

由于您的所有属性都是公开的,并且您的类中没有字段,为什么还要设置该值?


推荐阅读