1

我正在尝试遍历一个 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) {
    ...

这一直有效,直到我得到如下的“索赔”。

{
    "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 中使用以下 JSON 文本,但是 field_name 为空。

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

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

4

2 回答 2

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"];
}
于 2016-03-06T09:38:55.780 回答
0

您的问题中显示的 JSON 对象中没有Name字段。因此,您宁愿访问该mainsnak属性并从那里访问其他属性:

foreach (dynamic claimField in claim.Value)
{
    var value = claimField.mainsnak.datavalue.value;
    var type = claimField.type;
    ...
}
于 2016-03-06T08:38:46.987 回答