C# 使用未知的RootObject键对JSON.NET进行反序列化

C# 使用未知的RootObject键对JSON.NET进行反序列化,c#,json.net,steam-web-api,C#,Json.net,Steam Web Api,这是来自蒸汽API。正如您可以看到的,根键是ID本身,因此我不知道如何将其反序列化到对象。我看到了关于未知属性名称的其他问题,但似乎无法将这些解决方案应用于根名称未知的情况。一种方法是反序列化到字典 课程 { "578080": { "success": true, "data": { "type": "game", "name": "PLAYERUNKNOWN'S BATTLEGROUNDS", "steam_appid": 57

这是来自蒸汽API。正如您可以看到的,根键是ID本身,因此我不知道如何将其反序列化到对象。我看到了关于未知属性名称的其他问题,但似乎无法将这些解决方案应用于根名称未知的情况。

一种方法是反序列化到
字典

课程

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

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(json);
一种方法是反序列化到
字典

课程

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

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(json);

如果您不关心为反序列化数据创建POCO模型,只想使用
动态
获取一些属性,那么可以使用
JsonExtensionData
获取相关子对象的
JToken

var result = JsonConvert.DeserializeObject<Dictionary<string, SomeClass>>(json);
公共类Foo
{
[JsonExtensionData]
公共字典扩展数据{get;set;}
}
dynamic obj=JsonConvert.DeserializeObject(json.ExtensionData.Single().Value;
Console.WriteLine(目标成功);
Console.WriteLine(对象数据名称);

如果您可以跨多个不同类型的响应重用
Foo
,这种方法将特别有用,因为它根本不关心对象模式。

如果您不关心为反序列化数据创建POCO模型,而只想使用
动态
获取一些属性,那么这种方法将非常有用,您可以使用
JsonExtensionData
获取相关子对象的
JToken

var result = JsonConvert.DeserializeObject<Dictionary<string, SomeClass>>(json);
公共类Foo
{
[JsonExtensionData]
公共字典扩展数据{get;set;}
}
dynamic obj=JsonConvert.DeserializeObject(json.ExtensionData.Single().Value;
Console.WriteLine(目标成功);
Console.WriteLine(对象数据名称);

如果您可以跨多个不同类型的响应重用
Foo
,这种方法将特别有用,因为它根本不关心对象模式。

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

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);

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

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);

我假设ID是steam中的玩家ID,对吗?你把它保存在什么地方了吗?不,是AppID。所以每次调用都是不同的,因此我对如何实现这一点感到困惑。我假设ID是steam中的玩家ID,对吗?你把它保存在什么地方了吗?不,是AppID。所以每次打电话都不一样,因此我对如何让它工作感到困惑。谢谢,解决方法比我想象的要简单得多。顺便说一句,反序列化就像一个动词,因为我认为不正确的命名法?如果你说的是命名,是的,这是因为解决方案比我想象的要容易得多。顺便说一句,反序列化就像一个动词一样使用,因为我认为命名是不正确的?如果你说的是命名,是的,我实际上用一个类尝试了[JsonExtensionData],但没有这样做。extensiondata.Single()。我实际尝试了[JsonExtensionData]对于一个类,您完全可以使用它,但没有使用它。extensiondata.Single()。