在弄乱我想序列化为JSON的类时,我遇到了不确定如何最佳解决的情况。它与具有固定属性和随机属性的JSON结构有关(固定:属性名称始终相同,随机:它们的名称是随机的)。此外,固定属性始终为string
类型,随机属性始终为MyJsonClass2
类型。
例如:
{
"fixedName1": "value1",
"fixedName2": "value2",
"randomName1": { ... },
"randomNameN": { ... }
}
可以使用Dictionary<string, object>
来表示。但是,由于总是fixedName1
和fixedName2
给出,所以我希望将它们作为固定声明,并且仅将字典中的变量包含如下:
class MyJson
{
public string fixedName1 = "blah1";
public string fixedName2 = "blah2";
public Dictionary<string, MyJsonClass2> randomNames = new Dictionary<string, MyJsonClass2>();
}
这里的问题是,当对它进行序列化时,来自randomNames
的值将包含在名为randomNames的属性中,这很有意义,但这不是我想要的。有没有办法告诉Newtonsoft JSON序列化程序 ignore 字典名称?或定义此类的最佳方法是什么?
答案 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);
输出: