/ / Парсинг JSON: багаторівневий масив - php, масиви, json, синтаксичний аналіз, індексація

Розбір JSON: багаторівневий масив - php, масиви, json, синтаксичний аналіз, індексація

Мені потрібно отримати елемент з виходу 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", якщо індекс масиву, в якому він невідомий?

Відповіді:

1 для відповіді № 1

Це поверне індекс у attributes масив, який містить об'єкт з a 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

3 для відповіді № 2
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 ];