C# 具有自定义属性的字典的Newtonsoft Json序列化

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

我使用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() {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"
    }
}