Сначала у вас есть строка. JSON не является массивом, объектом или структурой данных. JSON - текстовый формат сериализации - так что причудливая строка, но все же просто строка. Декодируйте его в PHP с помощью json_decode()
.
$data = json_decode($json);
В нем вы можете найти:
Это то, что может быть закодировано в JSON. Или, точнее, это версии PHP, которые могут быть закодированы в JSON.
В них нет ничего особенного. Они не являются объектами JSON или массивами JSON. Вы расшифровали JSON - теперь у вас есть основные повседневные типы PHP .
Объекты будут экземплярами stdClass , встроенным классом, который просто generic thing , что здесь не важно.
Вы получаете доступ к свойствам одного из этих объектов так же, как и для публичных нестатических свойств любого другого объекта, например $object->property
.
$json = '
{
"type": "donut",
"name": "Cake"
}';
$yummy = json_decode($json);
echo $yummy->type; //donut
Доступ к элементам одного из этих массивов осуществляется так же, как и для любого другой массив, например $array[0]
.
$json = '
[
"Glazed",
"Chocolate with Sprinkles",
"Maple"
]';
$toppings = json_decode($json);
echo $toppings[1]; //Chocolate with Sprinkles
Итерации над ним с помощью foreach
.
foreach ($toppings as $topping) {
echo $topping, "\n";
}
Глазурованный Шоколад с спринклерами Maple
blockquote>Или беспорядок с любой из встроенных функций bazillion [].
Доступ к вложенные элементы
Свойства объектов и элементов массивов могут быть больше объектов и / или массивов - вы можете просто продолжать доступ к своим свойствам и членам как обычно, например
$object->array[0]->etc
.$json = ' { "type": "donut", "name": "Cake", "toppings": [ { "id": "5002", "type": "Glazed" }, { "id": "5006", "type": "Chocolate with Sprinkles" }, { "id": "5004", "type": "Maple" } ] }'; $yummy = json_decode($json); echo $yummy->toppings[2]->id; //5004
Передача
true
в качестве второго аргумента в json_decode ()Когда вы это сделаете, вместо объектов вы получите ассоциативные массивы - массивы со строками для ключей. Снова вы получаете доступ к их элементам, как обычно, например.
$array['key']
.$json = ' { "type": "donut", "name": "Cake", "toppings": [ { "id": "5002", "type": "Glazed" }, { "id": "5006", "type": "Chocolate with Sprinkles" }, { "id": "5004", "type": "Maple" } ] }'; $yummy = json_decode($json, true); echo $yummy['toppings'][2]['type']; //Maple
Не знаю, как структурированы данные
Прочитайте документацию, независимо от того, получение JSON из.
Посмотрите на JSON - где вы видите фигурные скобки
{}
, ожидайте объект, где вы видите квадратные скобки[]
, ожидаете массив.Нажмите декодированные данные с помощью
print_r()
:$json = ' { "type": "donut", "name": "Cake", "toppings": [ { "id": "5002", "type": "Glazed" }, { "id": "5006", "type": "Chocolate with Sprinkles" }, { "id": "5004", "type": "Maple" } ] }'; $yummy = json_decode($json); print_r($yummy);
и проверьте вывод:
stdClass Object ( [type] => donut [name] => Cake [toppings] => Array ( [0] => stdClass Object ( [id] => 5002 [type] => Glazed ) [1] => stdClass Object ( [id] => 5006 [type] => Chocolate with Sprinkles ) [2] => stdClass Object ( [id] => 5004 [type] => Maple ) ) )
Он расскажет вам, где у вас есть объекты, где у вас есть массивы, а также имена и значения их членов.
Если вы можете только дойти до него до того, как потеряетесь, зайдите так далеко и нажмите , что с
print_r()
:print_r($yummy->toppings[0]);
stdClass Object ( [id] => 5002 [type] => Glazed )
Разбить проблему на части, которые легче обернуть вокруг головы.
json_decode()
возвращаетnull
Это происходит потому, что либо:
- JSON полностью состоит именно из этого,
null
.- JSON is недействителен - проверьте результат
json_last_error_msg
или введите его через JSONLi nt .- Он содержит элементы, вложенные в глубину более 512 уровней. Эта максимальная глубина по умолчанию может быть переопределена путем передачи целого числа в качестве третьего аргумента в
json_decode()
.Если вам нужно изменить максимальную глубину, вы, вероятно, решение неправильной проблемы. Узнайте, почему вы получаете такие глубоко вложенные данные (например, у службы, к которой вы обращаетесь, у которой возникает JSON, есть ошибка) и получить это, чтобы этого не произошло.
Имя свойства объекта содержит специальный символ
Иногда у вас будет имя свойства объекта, которое содержит нечто вроде дефиса
-
или знака@
, которое не может использоваться в литеральном идентификаторе. Вместо этого вы можете использовать строковый литерал в фигурных скобках для его адресации.$json = '{"@attributes":{"answer":42}}'; $thing = json_decode($json); echo $thing->{'@attributes'}->answer; //42
Если у вас есть свойство integer as: Как получить доступ к свойствам объекта с именами типа целых чисел? как ссылка.
Кто-то поставил JSON в ваш JSON
Это смешно, но это происходит - JSON закодирован как строка в вашем JSON. Декодирование, доступ к строке как обычно, декодирование , которое , и, в конечном счете, доступ к тому, что вам нужно.
$json = ' { "type": "donut", "name": "Cake", "toppings": "[{ \"type\": \"Glazed\" }, { \"type\": \"Maple\" }]" }'; $yummy = json_decode($json); $toppings = json_decode($yummy->toppings); echo $toppings[0]->type; //Glazed
Данные не помещаются в память
Если ваш JSON слишком большой для
json_decode()
, чтобы обрабатывать сразу, все начинает становиться сложным. См. Также:Как отсортировать его
См.: Ссылка: все основные способы сортировки массивов и данных в PHP .
Основная проблема заключается в том, что ваши исходные файлы были декодированы неправильно. Перекодируйте их с неправильным кодированием (вероятно, cp1252
или latin
) и правильно декодируйте как utf8
.
Например:
>>> s = u'This dog \xe2\x80\x9d \xe2\x80\x9c'
>>> s.encode('latin1').decode('utf8')
'This dog ” “'
>>> s = u'''Thx WP for performing key democratic function. Trump wants to live in post truth world where words don't matter. D\xe2\x80\xa6 |\xef\xbf\xa3\xef\xbf\xa3\xef\xbf\xa3\xef\xbf\xa3\xef\xbf\xa3\xef\xbf\xa3\xef\xbf\xa3\xef\xbf\xa3\xef\xbf\xa3\xef\xbf\xa3|\n ME LA PELAS \n DONALD TRUMP \n|\xef\xbc\xbf\xef\xbc\xbf\xef\xbc\xbf\xef\xbc\xbf\xef\xbc\xbf\xef\xbc\xbf\xef\xbc\xbf\xef\xbc\xbf\xef\xbc\xbf\xef\xbc\xbf| \n (\\__/) ||\n (\xe2\x80\xa2\xe3\x85\x85\xe2\x80\xa2) ||\n / \xe3\x80\x80 \xe3\x81\xa5'''
>>> print(s.encode('latin1').decode('utf8'))
Thx WP for performing key democratic function. Trump wants to live in post truth world where words don't matter. D… | ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄|
ME LA PELAS
DONALD TRUMP
|__________|
(\__/) ||
(•ㅅ•) ||
/ づ
>>> s="I'm loving all the trump hate on Twitter right now \xf0\x9f\x99\x8c"
>>> s.encode('latin1').decode('utf8')
"I'm loving all the trump hate on Twitter right now