c# - 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)]
解决方案
当您使用自动属性(即{ get; set; }
)时,“编译器会创建一个私有的匿名支持字段,该字段只能通过属性的 get 和 set 访问器访问” (docs)
您在这里看到的是那些私有支持字段,正如MemberSerialization.Fields的文档所说 - “所有公共和私有字段都是序列化的。 ”
由于您的所有属性都是公开的,并且您的类中没有字段,为什么还要设置该值?
推荐阅读
- c# - 如何禁用excel非自定义选项卡中的按钮?
- unreal-engine4 - 如何模拟对物体的重力,而不是向下
- extjs - ExtJS 4.2 锁定可编辑网格问题
- objective-c - Objective-C 中是否存在转义闭包/回调?
- java - 哈希图的大小是多少?我什么时候分配它?
- java - 如何解析不规则使用引号的 CSV 文件?
- gitlab - 来自市场的 GitLab 部署未在 helm 中链接
- assembly - uint32x2x2_t 和 int32x4_t 之间的 arm-neon 转换
- roku - 可以在海报节点和 Roku 中的其他节点上设置计时器..?
- apache-flink - 关于flink连接远程任务管理器报错的问题