2016-03-06 136 views
0

我想通过一个维基数据JSON对象进行迭代,并获得了成功。我解析如下:http://www.wikidata.org/wiki/Special:EntityData/Q319.json如何迭代Wikidata JSON对象?

我与代码中将通过诸如下列:

dynamic a = JsonConvert.DeserializeObject<dynamic>(wikidata_pageContents); 
foreach (dynamic entity in a.entities) { 
    foreach (dynamic topLevelStructure in entity.Value) { 
    ... 

这工作,直到我得到类似下面的“声明”。

{ 
    "mainsnak": { 
     "snaktype": "value", 
     "property": "P1036", 
     "datavalue": { 
      "value": "523.45", 
      "type": "string" 
     }, 
     "datatype": "string" 
    }, 
    "type": "statement", 
    "id": "Q319$5525e016-4210-bb2c-ce03-bd2dd52cca6c", 
    "rank": "normal" 
} 

我在claim.Value中使用了以下内容,但field_name为null。

foreach (dynamic claimField in claim.Value) 
{ 
    string field_name = claimField.Name; 

如何动态地遍历上述对象中的值?如果可能,我宁愿迭代而不尝试建立对象结构和反序列化。

回答

1

一切都是正确的,我们只是不知道你是怎么得到claim,所以我想这个问题是存在的。这是非常简单的工作:

dynamic a = JsonConvert.DeserializeObject<dynamic>(json); 
foreach (dynamic entity in a.entities) 
{ 
    foreach (dynamic topLevelStructure in entity.Value) 
    { 
     if (topLevelStructure.Name == "claims") 
     { 
      foreach (dynamic claimField in topLevelStructure.Value) 
      { 
       var field_name = claimField.Name; 
       foreach (var p in claimField.Value) 
       { 
        var mainsnak = p.mainsnak; 
        var property = mainsnak.property.Value; 
        var datavalue = mainsnak.datavalue; 
        var value = datavalue.value.Value; 
        var type = datavalue.type.Value; 
       } 
      } 
     } 
    } 
} 

这里是另一种非常简单的方法,通过使用Newtonsoft.Json.Linq得到的所有要求值:

var claims = JObject.Parse(json)["entities"].First.First["claims"]; 
foreach (var claim in claims.Children()) 
{ 
    var mainsnak = claim.First.First["mainsnak"]; 
    var property = mainsnak["property"]; 
    var datavalue = mainsnak["datavalue"]; 
    var value = datavalue["value"]; 
    var type = datavalue["type"]; 
} 
0

您的问题中显示的JSON对象中没有Name字段。所以,你宁愿访问mainsnak财产,并与其他人:上面代码中的

foreach (dynamic claimField in claim.Value) 
{ 
    var value = claimField.mainsnak.datavalue.value; 
    var type = claimField.type; 
    ... 
}