JSON, сокращенно от JavaScript Object Notation, является распространенным облегченным форматом для хранения и обмена информацией. Как следует из названия, изначально он был получен из JavaScript, но это независимый от языка формат для хранения информации. Многие языки, такие как PHP, теперь реализуют функции для чтения и создания данных JSON.
Допустим, у вас есть файл, содержащий информацию в формате JSON. Как вы получаете доступ и храните его в PHP?
Во-первых, вам нужно получить данные из файла в переменную с помощью file_get_contents(). Как только данные находятся в строке, вы можете вызвать json_decode() функцию для извлечения информации из строки. Имейте в виду, что JSON просто предоставляет способ хранения информации в виде строки с использованием набора предопределенных правил. Наша работа заключается в правильном декодировании строк и получении нужной информации.
Функция json_decode() принимает четыре параметра, но в большинстве ситуаций вам понадобятся только первые два. Первый параметр указывает строку, которую вы хотите декодировать. Второй параметр определяет, как возвращаются декодированные данные. Установка его в true вернет ассоциативный массив и false вернет объекты. Вот простой пример. У нас есть файл с именем people.json со следующим содержимым:
{
"name": "Monty",
"email": "monty@something.com",
"age": 50
}
Мы можем прочитать информацию из этого файла JSON, используя следующий код:
<?php
$people_json = file_get_contents('people.json');
$decoded_json = json_decode($people_json, false);
echo $decoded_json->name;
// Monty
echo $decoded_json->email;
// monty@something.com
echo $decoded_json->age;
// 50
?>
В приведенном выше примере json_decode() возвращен объект, поскольку для второго параметра установлено значение false. Вы можете установить его, true чтобы вернуть данные в виде ассоциативного массива.
<?php
$people_json = file_get_contents('people.json');
$decoded_json = json_decode($people_json, true);
echo $decoded_json['name'];
// Monty
echo $decoded_json['email'];
// monty@something.com
echo $decoded_json['age'];
// 50
?>
Теперь мы распарсим немного более сложный JSON и пытаемся извлечь из него полезную информацию.
{
"name": "Monty",
"email": "monty@something.com",
"age": 77,
"countries": [
{"name": "Spain", "year": 1982},
{"name": "Australia", "year": 1996},
{"name": "Germany", "year": 1987}
]
}
Наша цель — вернуть все страны, которые посетил человек в разные годы. Значение, возвращаемое $decoded_json['countries'] на самом деле, будет массивом, и мы будем перебирать его, как обычные массивы, чтобы получить наши данные.
<?php
$people_json = file_get_contents('people.json');
$decoded_json = json_decode($people_json, true);
$name = $decoded_json['name'];
$countries = $decoded_json['countries'];
foreach($countries as $country) {
echo $name.' visited '.$country['name'].' in '.$country['year'].'.';
}
/*
Monty visited Spain in 1982.
Monty visited Australia in 1996.
Monty visited Germany in 1987.
*/
?>
Давайте рассмотрим последний пример извлечения информации из файла JSON. Вот JSON, из которого мы будем извлекать наши данные.
{
"customers": [
{
"name": "Andrew",
"email": "andrew@something.com",
"age": 62,
"countries": [
{
"name": "Italy",
"year": 1983
},
{
"name": "Canada",
"year": 1998
},
{
"name": "Germany",
"year": 2003
}
]
},
{
"name": "Sajal",
"email": "sajal@something.com",
"age": 65,
"countries": [
{
"name": "Belgium",
"year": 1994
},
{
"name": "Hungary",
"year": 2001
},
{
"name": "Chile",
"year": 2013
}
]
},
{
"name": "Adam",
"email": "adam@something.com",
"age": 72,
"countries": [
{
"name": "France",
"year": 1988
},
{
"name": "Brazil",
"year": 1998
},
{
"name": "Poland",
"year": 2002
}
]
},
{
"name": "Monty",
"email": "monty@something.com",
"age": 77,
"countries": [
{
"name": "Spain",
"year": 1982
},
{
"name": "Australia",
"year": 1996
},
{
"name": "Germany",
"year": 1987
}
]
}
]
}
На этот раз у нас есть два вложенных массива данных JSON. Таким образом, мы будем использовать два вложенных цикла, чтобы получить страны, которые посещают разные клиенты.
<?php
$people_json = file_get_contents('people.json');
$decoded_json = json_decode($people_json, true);
$customers = $decoded_json['customers'];
foreach($customers as $customer) {
$name = $customer['name'];
$countries = $customer['countries'];
foreach($countries as $country) {
echo $name.' visited '.$country['name'].' in '.$country['year'].'.';
}
}
/*
Andrew visited Italy in 1983.
Andrew visited Canada in 1998.
Andrew visited Germany in 2003.
Sajal visited Belgium in 1994.
Sajal visited Hungary in 2001.
Sajal visited Chile in 2013.
Adam visited France in 1988.
Adam visited Brazil in 1998.
Adam visited Poland in 2002.
Monty visited Spain in 1982.
Monty visited Australia in 1996.
Monty visited Germany in 1987.
*/
?>
Теперь у вас должно быть приблизительное представление о подходе, который вы должны использовать для чтения данных JSON из файла в зависимости от того, как он был создан.
До сих пор мы читали данные JSON, где уже знали все ключи. Это не всегда может быть правдой. К счастью, мы все еще можем извлечь полезную информацию из файла, сохранив его в виде ассоциативного массива. Следующий пример должен прояснить ситуацию.
{
"kdsvhe": {
"name": "Andrew",
"age": 62
},
"lvnwfd": {
"name": "Adam",
"age": 65
},
"ewrhbw": {
"name": "Sajal",
"age": 72
},
"klkwcn": {
"name": "Monty",
"age": 77
}
}
Ключи в приведенном выше JSON кажутся случайными строками, которые мы не можем предсказать заранее. Однако, как только мы преобразуем его в ассоциативный массив, нам больше не нужно будет знать точные значения ключей для перебора данных.
<?php
$people_json = file_get_contents('people.json');
$decoded_json = json_decode($people_json, true);
foreach($decoded_json as $key => $value) {
$name = $decoded_json[$key]["name"];
$age = $decoded_json[$key]["age"];
echo $name.' is '.$age.' years old.';
}
/*
Andrew is 62 years old.
Adam is 65 years old.
Sajal is 72 years old.
Monty is 77 years old.
*/
?>
Вы также можете преобразовать свои собственные данные в хорошо отформатированную строку JSON в PHP с помощью функции json_encode(). В основном он принимает три параметра, но обычно вам нужен только первый, то есть значение, которое вы хотите закодировать в большинстве ситуаций.
<?php
$people_info = [
"customers" => [
["name" => "Andrew", "score" => 62.5],
["name" => "Adam", "score" => 65.0],
["name" => "Sajal", "score" => 72.2],
["name" => "Monty", "score" => 57.8]
]
];
echo json_encode($people_info);
/*
{"customers":[{"name":"Andrew","score":62.5},{"name":"Adam","score":65},{"name":"Sajal","score":72.2},{"name":"Monty","score":57.8}]}
*/
?>
Вам также может понадобиться использовать некоторые флаги, чтобы получить строку JSON в нужном формате. Например, вы можете использовать JSON_PRETTY_PRINT флаг, чтобы добавить пробел для правильного форматирования строки JSON. Точно так же вы можете использовать JSON_PRESERVE_ZERO_FRACTION флаг, чтобы убедиться, что значения с плавающей запятой всегда хранятся как числа с плавающей запятой, даже если они эквивалентны некоторому целому по величине. Вы можете увидеть список всех таких флагов в официальной документации .
<?php
$people_info = [
"customers" => [
["name" => "Andrew", "score" => 62.5],
["name" => "Adam", "score" => 65.0],
["name" => "Sajal", "score" => 72.2],
["name" => "Monty", "score" => 57.8]
]
];
echo json_encode($people_info, JSON_PRETTY_PRINT|JSON_PRESERVE_ZERO_FRACTION);
/*
{
"customers": [
{
"name": "Andrew",
"score": 62.5
},
{
"name": "Adam",
"score": 65.0
},
{
"name": "Sajal",
"score": 72.2
},
{
"name": "Monty",
"score": 57.8
}
]
}
*/
?>
Формат JSON требует от нас соблюдения определенного набора правил для правильного кодирования и декодирования строк. Например, имена и значения должны быть заключены в двойные кавычки, а после пар имя-значение не должно быть завершающей запятой. Эта json_last_error_msg() функция может помочь вам выяснить, какую ошибку вы получаете, чтобы вы могли предпринять соответствующие шаги. Вот очень простой пример:
<?php
$sample_json = '{"name": "value", }';
var_dump(json_decode($sample_json));
// NULL
echo json_last_error_msg();
// Syntax error
?>
На этом все! Удачной Вас разработки и адекватных клиентов.
Коментарии отсутствуют, будьте первым(ой) кто напишет под этим постом!
Написать коментарий