如何遍历 Wikidata JSON 对象?
How to iterate through a Wikidata JSON object?
我正在尝试遍历 Wikidata JSON 对象并在一定程度上取得了成功。我正在解析以下内容:http://www.wikidata.org/wiki/Special:EntityData/Q319.json
我正在使用如下代码进行迭代:
dynamic a = JsonConvert.DeserializeObject<dynamic>(wikidata_pageContents);
foreach (dynamic entity in a.entities) {
foreach (dynamic topLevelStructure in entity.Value) {
...
这一直有效,直到我达到如下所示的 'claim'。
{
"mainsnak": {
"snaktype": "value",
"property": "P1036",
"datavalue": {
"value": "523.45",
"type": "string"
},
"datatype": "string"
},
"type": "statement",
"id": "Q31925e016-4210-bb2c-ce03-bd2dd52cca6c",
"rank": "normal"
}
我将以下内容与 claim.Value 中的上述 JSON 文本一起使用,但是 field_name 为空。
foreach (dynamic claimField in claim.Value)
{
string field_name = claimField.Name;
如何动态循环访问上述对象中的值?我宁愿迭代而不是尝试建立对象结构并在可能的情况下反序列化。
您问题中显示的 JSON 对象中没有 Name
字段。所以你宁愿访问 mainsnak
属性 并从那里访问其他的:
foreach (dynamic claimField in claim.Value)
{
var value = claimField.mainsnak.datavalue.value;
var type = claimField.type;
...
}
上面代码中的所有内容都是正确的,我们只是不知道您是如何获得 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"];
}
我正在尝试遍历 Wikidata JSON 对象并在一定程度上取得了成功。我正在解析以下内容:http://www.wikidata.org/wiki/Special:EntityData/Q319.json
我正在使用如下代码进行迭代:
dynamic a = JsonConvert.DeserializeObject<dynamic>(wikidata_pageContents);
foreach (dynamic entity in a.entities) {
foreach (dynamic topLevelStructure in entity.Value) {
...
这一直有效,直到我达到如下所示的 'claim'。
{
"mainsnak": {
"snaktype": "value",
"property": "P1036",
"datavalue": {
"value": "523.45",
"type": "string"
},
"datatype": "string"
},
"type": "statement",
"id": "Q31925e016-4210-bb2c-ce03-bd2dd52cca6c",
"rank": "normal"
}
我将以下内容与 claim.Value 中的上述 JSON 文本一起使用,但是 field_name 为空。
foreach (dynamic claimField in claim.Value)
{
string field_name = claimField.Name;
如何动态循环访问上述对象中的值?我宁愿迭代而不是尝试建立对象结构并在可能的情况下反序列化。
您问题中显示的 JSON 对象中没有 Name
字段。所以你宁愿访问 mainsnak
属性 并从那里访问其他的:
foreach (dynamic claimField in claim.Value)
{
var value = claimField.mainsnak.datavalue.value;
var type = claimField.type;
...
}
上面代码中的所有内容都是正确的,我们只是不知道您是如何获得 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"];
}