使用未知的RootObject密钥对JSON.NET进行驱动

时间:2018-03-17 07:30:45

标签: c# json.net steam-web-api

{
"578080": {
    "success": true,
    "data": {
        "type": "game",
        "name": "PLAYERUNKNOWN'S BATTLEGROUNDS",
        "steam_appid": 578080,
        "required_age": 0,
        "is_free": false,
        }
    }
}

这是来自Steam API。正如您可以看到ID本身的根密钥,因此我不知道如何将其反序列化为对象。我已经看到了有关未知属性名称的其他问题,但似乎无法在根名称未知时应用这些解决方案。

3 个答案:

答案 0 :(得分:2)

执行此操作的一种方法是反序列化Dictionary

<强>类

public class Data
{
    public string type { get; set; }
    public string name { get; set; }
    public int steam_appid { get; set; }
    public int required_age { get; set; }
    public bool is_free { get; set; }
}

public class SomeClass
{
    public bool success { get; set; }
    public Data data { get; set; }
}

<强>用法

var result = JsonConvert.DeserializeObject<Dictionary<string, SomeClass>>(json);

答案 1 :(得分:1)

如果您不关心为反序列化数据制作POCO模型,并且只想使用dynamic获取某些属性,则可以使用JsonExtensionData获取JToken相关子对象:

public class Foo
{
    [JsonExtensionData]
    public Dictionary<string, JToken> ExtensionData {get; set;}
}

dynamic obj = JsonConvert.DeserializeObject<Foo>(json).ExtensionData.Single().Value;
Console.WriteLine(obj.success);
Console.WriteLine(obj.data.name);

如果您可以在几种不同类型的响应中重用Foo,则此方法特别有用,因为它根本不关心对象模式。

答案 2 :(得分:1)

您可以使用匿名类型反序列化来解析这样的JSON数据,而无需创建类。我假设您的数据中只有一个Id(“578080”)。如果存在更多Id,您可以为这些Id创建一个数组。希望它有效。

 var finalResult=JsonConvert.DeserializeAnonymousType(
        yourdata,  // input
        new 
        {
          Id= 
          {
            new
            { 
              success="", data=""
            }
          }
        }
      ); 

console.write(finalResult.Id);// getting Id 578080
console.write(finalResult.Id.success);
console.write(finalResult.Id.data.type);