我正在尝试通过使用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)]
答案 0 :(得分:2)
当您使用自动属性(即{ get; set; }
)时,“编译器会创建一个私有的匿名后备字段,只能通过属性的get和set访问器进行访问” { {3}}
您在这里看到的是那些私有支持字段,就像(docs)的文档所说的那样-“ 所有公共和私有字段都已序列化。”
由于您所有的属性都是公开的,并且您的课程中没有任何字段,所以为什么仍要设置该值?
答案 1 :(得分:0)
即使我具有字段和自动属性,我也希望只有这些字段才能被序列化。但是,也有自动属性。只是尝试过,我们不希望序列化文件中有任何属性数据。现在很清楚为什么有k__BackingField了。谢谢!