C# 使用变量键名访问JSON项

C# 使用变量键名访问JSON项,c#,json,mediawiki,wikidata,wikidata-api,C#,Json,Mediawiki,Wikidata,Wikidata Api,下面是我的JSON数据,它恰好是Wikidata提供的格式,不过为了清晰起见,它被大大缩减了 { "entities": { "Q200405": { "id": "Q200405", "type": "item", "claims": "Cheese" } } } 我正试图在c#内访问此数据。我的问题是Q200405是动态的-它基本上是我正在检索的记录编号。例如,另一页可能会给我 { "entities": {

下面是我的JSON数据,它恰好是Wikidata提供的格式,不过为了清晰起见,它被大大缩减了

{
"entities": {
    "Q200405": {
        "id": "Q200405",
        "type": "item",
        "claims": "Cheese"
        }
    }
}
我正试图在c#内访问此数据。我的问题是Q200405是动态的-它基本上是我正在检索的记录编号。例如,另一页可能会给我

{
"entities": {
    "Q123456": {
        "id": "Q123456",
        "type": "item",
        "claims": "Lemon"
        }
    }
}
到目前为止,我最好的尝试是使用Json.NET(Newtonsoft) ;

json=“{\'entities\”:{\'Q200405\“{\'id\”:\'Q200405\”,\“type\”:\“item\”,\“claims\”:“Cheese\”});
var Query=JsonConvert.DeserializeObject(json);
字符串实体=Query.entities.ToString();
Query=JsonConvert.DeserializeObject(实体);
字符串实体=Query.Q200405.ToString();
Query=JsonConvert.DeserializeObject(实体);
string id=Query.id.ToString();
string claims=Query.claims.ToString();
这是可行的,但显然硬编码Query.Q200405.ToString()不是理想的解决方案!我可能也不应该执行多个反序列化语句来深入数据


我的问题是,将上述JSON格式读入c#程序的最佳方式是什么

如果要将名称放入字符串变量中,只需使用
JObject

string id = "Q200405"; // Or wherever you get that from
string text = "{\"entities...";
var json = JObject.Parse(text);

var claim = json["entities"][id];

string claims = (string) claim["claims"];
string type = (string) claim["type"];
// etc
基本上,LINQ到JSON就是您在这里想要的

编辑:如果您事先不知道ID,可以使用:

var json = JObject.Parse(text);
var entities = (JObject) json["entities"];
var entity = entities.Properties().First();
var id = entity.Name;
var claim = (JObject) entity.Value;
string claims = (string) claim["claims"];
string type = (string) claim["type"];
Console.WriteLine(new { claims, type, id });

这就是您可以解析它的方式

class Data
{
    public string id { get; set; }
    public string type { get; set; }
    public string claims { get; set; }
}

var obj = Newtonsoft.Json.JsonConvert.DeserializeObject<Dictionary<string, Dictionary<string,Data>>>(json);
Data data = obj["entities"].FirstOrDefault().Value;
类数据
{
公共字符串id{get;set;}
公共字符串类型{get;set;}
公共字符串声明{get;set;}
}
var obj=Newtonsoft.Json.JsonConvert.DeserializeObject(Json);
数据数据=obj[“实体”].FirstOrDefault().Value;

看起来您可能需要某种json的X路径查询。假设您在需要时没有id值是否公平?或者它是本例中的一个参数?一旦你将json导入.NET,我强烈建议你看看restsharp:就最佳实践而言。我不知道ID。原始示例是在wikidata.org上查找John Hurt,ID恰好是他们的记录号。该方法可以工作,但我不知道ID,并且在不同记录之间有所不同。然而,在我的例子中,我可以简单地使用stringid=text.Substring(14,7);尽管这似乎是一种糟糕的做事方式@MortimerCat:不,如果你不知道ID,但它是唯一的ID,你可以使用
json[“实体”]。首先
-这将获得第一个子令牌。是的,那太好了。我错过了第一个和第一个默认方法。谢谢。现在我实际试用了您的最新版本,我收到了错误消息,无法访问
string claims=(string)claims[“claims”]上Newtonsoft.Json.Linq.JProperty的子值line@MortimerCat:现在修复-尝试一下。(它适用于我的JSON示例)
class Data
{
    public string id { get; set; }
    public string type { get; set; }
    public string claims { get; set; }
}

var obj = Newtonsoft.Json.JsonConvert.DeserializeObject<Dictionary<string, Dictionary<string,Data>>>(json);
Data data = obj["entities"].FirstOrDefault().Value;