C# 使用未知的RootObject键对JSON.NET进行反序列化
这是来自蒸汽API。正如您可以看到的,根键是ID本身,因此我不知道如何将其反序列化到对象。我看到了关于未知属性名称的其他问题,但似乎无法将这些解决方案应用于根名称未知的情况。一种方法是反序列化到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
字典
课程
{
"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()。