C# 是否可以展平(隐藏)字典变量名?

C# 是否可以展平(隐藏)字典变量名?,c#,json,serialization,json.net,C#,Json,Serialization,Json.net,在处理一个我想序列化为JSON的类时,我遇到了一个我不确定如何最好地解决的情况。它与一个JSON结构有关,该结构同时具有固定属性和随机属性(固定:总是相同的属性名,随机:它们的名称是随机的)。此外,固定属性的类型始终为string,而随机属性的类型始终为MyJsonClass2 例如: { "fixedName1": "value1", "fixedName2": "value2", "randomName1": { ... }, "randomNameN": { ... } } 这可

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

例如:

{
 "fixedName1": "value1",
 "fixedName2": "value2",
 "randomName1": { ... },
 "randomNameN": { ... }
}
这可以使用
字典
表示。但是,由于总是给出
fixedName1
fixedName2
,因此我希望将它们作为固定声明,并且在字典中只包含以下变量:

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

    public Dictionary<string, MyJsonClass2> randomNames = new Dictionary<string, MyJsonClass2>();
}
类MyJson
{
公共字符串fixedName1=“blah1”;
公共字符串fixedName2=“blah2”;
公共字典randomNames=新字典();
}

这里的问题是,当序列化时,
randomNames
中的值被包含在一个名为randomNames的属性中,这是有意义的,但是这不是我想要看到的。有没有办法告诉Newtonsoft JSON序列化程序忽略字典名?或者,定义此类的最佳方式是什么?

在json中,一些键/值数据是固定的,一些键/值对数据是随机的,或者简单地说是动态的

然后可以声明固定键/值对的属性。但问题发生在你们提出的动态和问题出现时

所以Newtonsoft.json有一个特性要在这里使用,那就是
[JsonExtensionData]

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

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

public string fixedName1 {get;set;}
public string fixedName2 {get;set;}
对于动态或随机键/值对,您需要使用
[JsonExtensionData]
来修饰字典属性。像

[JsonExtensionData]
public Dictionary<string, JToken> randomNames {get;set;}
[JsonExtensionData]
公共字典随机名称{get;set;}
所以你的课看起来像

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

    [JsonExtensionData]
    public Dictionary<string, JToken> randomNames {get;set;}
}
类MyJson
{
公共字符串fixedName1{get;set;}
公共字符串fixedName2{get;set;}
[JsonExtensionData]
公共字典随机名称{get;set;}
}
现在尝试用上面的类序列化您的数据,您将永远无法在输出序列化的json中获得字典名称

你可以试试上面的课

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);
MyJson MyJson=new MyJson();
myJson.fixedName1=“ABC”;
myJson.fixedName2=“PQR”;
myJson.randomNames=新字典();
添加(“randomName1”,JToken.FromObject(新的MyJsonClass2{Name=“QWERTY”}));
添加(“randomname”,JToken.FromObject(新的MyJsonClass2{Name=“ZXCVBNM”}));
string json=JsonConvert.SerializeObject(myJson);
输出:


您可能会创建一个
JsonConverter
。不确定是否有更好的选择。您可以实现自定义JsonConverter。然而,你所描述的似乎有点奇怪。为什么要这样做?
JsonTypedExtensionDataAttribute
TypedExtensionDataConverter
from-to可能就是您需要的。同意吗?谢谢你的解决方案。在我勾选你的答案之前,我想彻底测试一下,但后来我被一些其他的工作搞得支离破碎。。。但我现在已经检查过了,输出现在看起来很棒:)很高兴听到,欢迎:)