2012-06-06 2 views
3

Мне нужно получить элемент из выхода json, однако содержимое json не всегда согласовано.Parsing JSON: многоуровневый массив

Например, если я хочу получить значение для «имя» было бы ['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», если индекс массива, в котором он находится, неизвестен?

+0

У вас есть контроль над выходом JSON? –

+0

Я не делаю этого, это результат от стороннего api. –

+1

Это несчастливо. Я бы, по крайней мере, подал сообщение об ошибке с третьей стороной, так как свойство 'attributes' не очень хорошо спроектировано; вместо массива причудливо-сгруппированных атрибутов, он должен быть просто объектом с каждым атрибутом, объявленным отдельно. то есть: '{" result ": {" attributes ": {" user ":" newb "," name ":" mike "," state ":" california "," city ":" los angeles "}}}' –

ответ

1

Это вернет индекс в attributes массив, который содержит объект с name атрибутом "mike".

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 
+0

Мне нужен индекс атрибута mike быть в. Я пытаюсь написать функцию, где я могу получить значение пользователя, где name = mike. Таким образом, в случае, если оба атрибута содержат одного и того же пользователя, но разные имена. –

+0

@MikeMills - Это вы имели в виду? –

+0

Это немного ближе к тому, что мне нужно. Скажем, в json есть ключ в атрибутах, называемый «fieldid», а значение «372», а в каждом атрибуте есть ключ, называемый «value», и мне нужно получить значение ключа «value», где fieldid == 372. –

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, два объекта должны быть просто объединены.


EDIT: К сожалению, здесь идет PHP:

$attrs = json_decode($jsonStr, true)["result"]["attributes"]; 
return $attrs[ isset($attrs[0]["name"]) ? 0 : 1 ]; 
+1

Я считаю, что OP хочет PHP-решение, а не Javascript. –

+1

Ух, почему я всегда думаю «JavaScript», когда он подсвечивается как «JSON»? :-( – Bergi

+0

Да, я развиваюсь на PHP. Извините за любую путаницу. –

Смежные вопросы