可以拼合(隐藏)Dictionary变量名称吗?

时间:2018-12-05 06:30:48

标签: c# json serialization json.net

在弄乱我想序列化为JSON的类时,我遇到了不确定如何最佳解决的情况。它与具有固定属性和随机属性的JSON结构有关(固定:属性名称始终相同,随机:它们的名称是随机的)。此外,固定属性始终为string类型,随机属性始终为MyJsonClass2类型。

例如:

{
 "fixedName1": "value1",
 "fixedName2": "value2",
 "randomName1": { ... },
 "randomNameN": { ... }
}

可以使用Dictionary<string, object>来表示。但是,由于总是fixedName1fixedName2给出,所以我希望将它们作为固定声明,并且仅将字典中的变量包含如下:

class MyJson
{
    public string fixedName1 = "blah1";
    public string fixedName2 = "blah2";

    public Dictionary<string, MyJsonClass2> randomNames = new Dictionary<string, MyJsonClass2>();
}

这里的问题是,当对它进行序列化时,来自randomNames的值将包含在名为randomNames的属性中,这很有意义,但这不是我想要的。有没有办法告诉Newtonsoft JSON序列化程序 ignore 字典名称?或定义此类的最佳方法是什么?

1 个答案:

答案 0 :(得分:1)

在json中,您的某些键/值数据是固定的,而某些键/值对数据是随机的,或者只是说它是动态的。

然后,您可以声明固定键/值对的属性。但是当您询问其动态和问题时,就会出现问题。

因此,Newtonsoft.json具有一个要在此处使用的功能,即[JsonExtensionData]Read more

  

现在,序列化对象时将写入扩展数据。读取和写入扩展数据可以自动往返所有JSON,而无需将所有属性添加到要反序列化的.NET类型。仅声明您感兴趣的属性,然后让扩展数据完成其余工作。

现在,您可以像这样为固定的键/值配对数据添加属性。

public string fixedName1 {get;set;}
public string fixedName2 {get;set;}

对于动态或随机键/值对,您需要用[JsonExtensionData]装饰Dictionary属性。喜欢

[JsonExtensionData]
public Dictionary<string, JToken> randomNames {get;set;}

所以您的课程看起来像

class MyJson
{
    public string fixedName1 {get;set;}
    public string fixedName2 {get;set;}

    [JsonExtensionData]
    public Dictionary<string, JToken> randomNames {get;set;}
}

现在尝试使用上述类序列化数据,您将永远不会在输出序列化的json中获得Dictionary名称。

您可以像上课那样尝试

MyJson myJson = new MyJson();
myJson.fixedName1 = "ABC";
myJson.fixedName2 = "PQR";
myJson.randomNames = new Dictionary<string, JToken>();
myJson.randomNames.Add("randomName1", JToken.FromObject(new MyJsonClass2 { Name = "QWERTY" }));
myJson.randomNames.Add("randomNameN", JToken.FromObject(new MyJsonClass2 { Name = "ZXCVBNM" }));

string json = JsonConvert.SerializeObject(myJson);

输出:

enter image description here