C# 具有自定义属性的字典的Newtonsoft Json序列化
我使用Newtonsoft.jsonv6.0.6编写了以下C#代码:C# 具有自定义属性的字典的Newtonsoft Json序列化,c#,serialization,json.net,C#,Serialization,Json.net,我使用Newtonsoft.jsonv6.0.6编写了以下C#代码: void Main() { var data=new AllData(); var cst=new CustomerData(); cst.CustomerName="Customer1"; cst.Add(1, new UserData() {UserName="User1", UserPhone="123456789"}); cst.Add(2, new UserData() {Us
void Main() {
var data=new AllData();
var cst=new CustomerData();
cst.CustomerName="Customer1";
cst.Add(1, new UserData() {UserName="User1", UserPhone="123456789"});
cst.Add(2, new UserData() {UserName="User2", UserPhone="987654321"});
data.Add(1, cst);
string json = Newtonsoft.Json.JsonConvert.SerializeObject(data, Newtonsoft.Json.Formatting.Indented);
Console.WriteLine(json);
}
public class UserData {
public string UserName;
public string UserPhone;
}
public class CustomerData:Dictionary<int,UserData> {
public string CustomerName;
}
public class AllData:Dictionary<int,CustomerData> {}
但我看到的是:
{
"1": {
"1": {
"UserName": "User1",
"UserPhone": "123456789"
},
"2": {
"UserName": "User2",
"UserPhone": "987654321"
}
}
}
i、 e.我的CustomerName属性被忽略
我使用了Newtonsoft.Json.MemberSerialization和Newtonsoft.Json.JsonProperty属性,但没有成功,所以我想知道现在该去哪里查看。一个完全定制的序列化实现似乎有些过分,有没有简单的方法来解决这个问题 您可以使用JSON.Net提供的将父对象上不存在的任何属性放入集合属性中
这里有一个例子取自
JSON:
C#数据对象:
public class Test
{
public string X { get; set; }
[JsonExtensionData]
public Dictionary<string, object> Y { get; set; }
}
从
列表
或字典
继承被认为是代码气味。有没有什么理由你不能不继承字典
?@AndyJ-我知道自定义序列化,但似乎应该有一种更简单的方法,因此我的question@GediminasMasaitis我可以有一个字典的属性,但是这使得Json序列化更加复杂,因为我想省略属性名。我可以有一个私有字典和自己的访问器方法,但这使我的示例变得复杂,所以我选择继承来演示JsonExtensionDataAttribute是否合适?啊,谢谢你,我知道你怎么用它了。非常感谢@AndyJ,这是一个很好的简洁解决方案:-)没问题,我很高兴你把它整理好了:)
{
"X" : "value",
"key1": "value1",
"key2": "value2"
}
public class Test
{
public string X { get; set; }
[JsonExtensionData]
public Dictionary<string, object> Y { get; set; }
}
public class UserData
{
public string UserName;
public string UserPhone;
}
public class CustomerData
{
public string CustomerName;
[JsonExtensionData]
public Dictionary<string, object> Users;
}
var data = new CustomerData()
{
CustomerName = "Foo",
Users = new Dictionary<string, object>()
{
{ "1", new UserData() { UserName = "Fireman", UserPhone = "0118 999 881 999 119 725 ... 3" } },
{ "2", new UserData() { UserName = "Jenny", UserPhone = "867-5309" } }
}
};
{
"customerName": "Foo",
"1": {
"userName": "Fireman",
"userPhone": "0118 999 881 999 119 725 ... 3"
},
"2": {
"userName": "Jenny",
"userPhone": "867-5309"
}
}