【问题标题】:Derserialize JSON.NET With Unknown RootObject Key使用未知的 RootObject 键反序列化 JSON.NET
【发布时间】:2026-01-20 00:25:01
【问题描述】:
{
"578080": {
    "success": true,
    "data": {
        "type": "game",
        "name": "PLAYERUNKNOWN'S BATTLEGROUNDS",
        "steam_appid": 578080,
        "required_age": 0,
        "is_free": false,
        }
    }
}

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

【问题讨论】:

  • 我认为 ID 是 Steam 中的玩家 ID 对吧?你把它保存在某个地方吗?
  • 不,是 AppID。所以每次通话都不同,因此我对如何进行这项工作感到困惑。

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


【解决方案1】:

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

【讨论】:

  • 感谢解决方案比我意识到的要容易得多。顺便说一句,因为我确实认为命名不正确,所以像动词一样使用反序列化?
  • 如果你在谈论命名,是的
【解决方案2】:

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

【讨论】:

  • 我实际上尝试了 [JsonExtensionData] 与一个完全一样的类,但没有执行 '.ExtenstionData.Single()。
【解决方案3】:

您可以像这样使用匿名类型反序列化来解析 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);

【讨论】: