解析JSON:多级数组

3

我需要从json输出中获取一个项目,但json内容并不总是一致的。

例如,如果我想获取“name”的值,它将是['result']['attributes'][0]['name'];

但是如果json以第二个示例传递,则应为['result']['attributes'][1]['name'];

{"result":{
    "attributes":[
        {"user":"newb","name":"mike"},
        {"state":"california","city":"los angeles"}
    ]
}}

{"result":{
    "attributes":[
        {"state":"california","city":"los angeles"},
        {"user":"newb","name":"mike"}
    ]
}}

如果不知道数组中的索引,我该如何获取“name”值?

你能控制JSON输出吗? - Shaggy Frog
我不是,这是来自第三方API的输出。 - Mike Mills
1
很遗憾。至少我会向第三方提交一个错误报告,因为“attributes”属性的设计非常糟糕;与其是一组奇怪分组的数组,它应该只是一个对象,并且每个属性都应该单独声明。例如:{"result":{"attributes":{"user":"newb","name":"mike","state":"california","city":"los angeles"}}} - Shaggy Frog
2个回答

3
var arr = obj.result.attributes;
for (var i=0; i<arr.length; i++)
    if ("name" in arr[i])
         return arr[i].name;

或者,如果数组中始终只有两个对象:
 var attrs = obj.result.attributes;
 return attrs["name" in attrs[0] ? 0 : 1].name;

我建议更改该API,将两个对象合并为一个。以下是PHP代码:
$attrs = json_decode($jsonStr, true)["result"]["attributes"];
return $attrs[ isset($attrs[0]["name"]) ? 0 : 1 ];

1
我相信原始问题的提问者想要的是 PHP 的解决方案,而不是 Javascript。 - David Harkness
1
唉,为什么每次看到“JSON”高亮显示时我总是想到“JavaScript”呢? :-( - Bergi
是的,我正在使用PHP进行开发。对于任何困惑感到抱歉。 - Mike Mills

1

这将返回包含具有 name 属性为 "mike" 的对象的 attributes 数组中的索引。

function extractNameFromJson($json) {
    foreach ($json->result->attributes as $i => $attribute) {
        if (isset($attribute['name']) && $attribute['name'] == 'mike') {
            return $i;
        }
    }
}

$index = extractNameFromJson($json);
echo $json->result->attributes[$index]['user'];

==> newb

我需要知道mike属性的索引。我正在尝试编写一个函数,可以获取name = mike的用户的值。这样,在两个属性都包含相同用户但不同名称的情况下,就可以得到所需的值。 - Mike Mills
@MikeMills - 这是你想要的吗? - David Harkness
这离我需要的稍微更接近一些。假设在 json 中有一个名为“fieldid”的属性键,并且该值为“372”,并且在每个属性中都有一个名为“value”的键,我需要获取其中 fieldid == 372 的“value”键的值。 - Mike Mills
函数 getfieldid($json, [fieldid 值]) { $djson = json_decode($json, true); // 查找键 "fieldid" == [fieldid 值] 的 "value" 键的值的代码 } - Mike Mills
function Getfieldid($json, $fid) { $djson = json_decode($json, true); foreach ($djson['result']['attributes'] as $i => $attribute) { if (isset($attribute['fieldId']) && $attribute['fieldId'] == $fid) { return $djson['result']['attributes'][$i]['value']; } } } 现在它正常工作了,谢谢 David :) - Mike Mills

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接