使用未知的 RootObject 密钥反序列化 JSON.NET

Derserialize JSON.NET With Unknown RootObject Key

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

这是来自 Steam API。如您所见,根键是 ID 本身,所以我不知道如何将其反序列化为对象。我看过其他关于未知 属性 名称的问题,但似乎无法在根名称未知时应用这些解决方案。

一种方法是反序列化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);

如果您不关心为反序列化数据制作 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,这种方法将特别有用,因为它根本不关心对象架构。

您可以像这样使用匿名类型反序列化来解析 JSON 数据,而无需创建 类。我假设您的 data.If 更多 ID 中只有一个 Id("578080"),您可以为这些 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);