使用变量键名访问JSON项

时间:2014-12-18 23:10:24

标签: c# json mediawiki wikidata wikidata-api

以下是我的JSON数据,恰好是维基数据提供的格式,虽然为了清晰起见而大大减少了。

{
"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<dynamic>(json);
string entities = Query.entities.ToString();

Query = JsonConvert.DeserializeObject<dynamic>(entities);
string entity = Query.Q200405.ToString();

Query = JsonConvert.DeserializeObject<dynamic>(entity);
string id = Query.id.ToString();
string claims = Query.claims.ToString();

这有效,但显然硬编码 Query.Q200405.ToString()不是理想的解决方案!我可能不应该做多个Deserialize语句来深入研究数据吗?

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

2 个答案:

答案 0 :(得分:7)

如果您想将名称放入字符串变量中,只需使用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 to 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 });

答案 1 :(得分:2)

这是你解析它的方法

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;