C# 将具有变量属性的JSON对象解析为强类型对象

C# 将具有变量属性的JSON对象解析为强类型对象,c#,json,parsing,json.net,C#,Json,Parsing,Json.net,我有一个JSON对象,它可以有任意数量的动态属性。所有属性都是主要由相同字段组成的对象。如何将此JSON解析为C#中的强类型对象?我将把整个树解析为一个JObject,然后在适当的子对象上调用tobject。示例代码: { "Profile": { "dProperty1": { "a": "value", "b": "value", "c": "value", "d": "value", "e": "val

我有一个JSON对象,它可以有任意数量的动态属性。所有属性都是主要由相同字段组成的对象。如何将此JSON解析为C#中的强类型对象?

我将把整个树解析为一个
JObject
,然后在适当的子对象上调用
tobject
。示例代码:

{
"Profile": {
    "dProperty1": {
        "a": "value",
        "b": "value",
        "c": "value",
        "d": "value",
        "e": "value"
    },
    "dProperty2": {
        "a": "value",
        "b": "value",
        "d": "value",
        "e": "value"
    },
    "dProperty3": {
        "a": "value",
        "b": "value",
        "d": "value",
        "e": "value"
       }
    }
}
结果:

{
  "Profile": {
    "dProperty1": {
      "name": "First",
      "age": 30,
      "extra": "Ignored"
    },
    "dProperty2": {
      "name": "Second",
      "age": 25
    },
    "dProperty3": {
      "name": "Third",
      "age": 50
    }
  }
}

若你们必须有强类型的结果,我会反序列化配置文件作为属性叠加的字典

Key: dProperty1; Name: First; Age: 30
Key: dProperty2; Name: Second; Age: 25
Key: dProperty3; Name: Third; Age: 50
类AbscdeClass
{
公共字符串A{get;set;}
公共字符串B{get;set;}
公共字符串C{get;set;}
公共字符串D{get;set;}
公共字符串E{get;set;}
}
类JsonBody
{
公共字典配置文件{get;set;}
}
并将原始JSON文本解析为

class AbscdeClass
{
    public string A { get; set; }
    public string B { get; set; }
    public string C { get; set; }
    public string D { get; set; }
    public string E { get; set; }
}

class JsonBody
{
    public Dictionary<string, AbscdeClass> Profile { get; set; }
}
JsonBody json=JsonConvert.DeserializeObject(jsonString);

他们会一直保持相同的名字吗?这有点“不干净”,但在过去,我为不同的变体创建了一个包含所有可能属性的类,但是JSON可能没有所有属性。它只是忽略类中JSON中没有对应项的属性。使用所有可能的属性创建类型并反序列化JSON。您可以将概要文件反序列化为字典(其中AbcdeClass包含JSON属性的叠加),例如,您在这里说如果我“必须”。您推荐另一种方法吗?您可以使用动态类型(如@Jon Skeet的回答)。在你的例子中,我会选择静态类型的字典。如果叠加类变得太大和无结构,或者如果属性列表可以快速演化,我会做动力学。因为您明确表示需要静态类型,所以这个推理是unnecessary@Igor:我没有使用动态类型。我正在解析一个
JObject
,但是我没有在任何地方使用dynmamic类型,我仍然有一个静态类型作为值的字典。。。“提醒你,你的方法也没有什么问题。”乔恩·斯凯特。我的坏-我对JObject的出现反应太快了。动态使用JObject.Parse的示例可以在
class AbscdeClass
{
    public string A { get; set; }
    public string B { get; set; }
    public string C { get; set; }
    public string D { get; set; }
    public string E { get; set; }
}

class JsonBody
{
    public Dictionary<string, AbscdeClass> Profile { get; set; }
}
JsonBody json = JsonConvert.DeserializeObject<JsonBody>(jsonString);