Работа с данными в формате JSON
JSON (англ. JavaScript Object Notation) — текстовый формат обмена данными, основанный на JavaScript и обычно используемый именно с этим языком. Как и многие другие текстовые форматы, JSON легко читается людьми. Формат JSON был разработан Дугласом Крокфордом [1].
Несмотря на происхождение от JavaScript (точнее, от подмножества языка стандарта ECMA-262 1999 года), формат считается языконезависимым и может использоваться практически с любым языком программирования. Для многих языков существует готовый код для создания и обработки данных в формате JSON.
Использование
За счёт своей лаконичности по сравнению с XML, формат JSON может быть более подходящим для сериализации сложных структур. Если говорить о веб-приложениях, в таком ключе он уместен в задачах обмена данными как между браузером и сервером (AJAX), так и между самими серверами (программные HTTP-интерфейсы).
Поскольку формат JSON является подмножеством синтаксиса языка JavaScript, то он может быть быстро десериализован встроенной функцией eval(). Кроме того, возможна вставка вполне работоспособных JavaScript-функций. В языке PHP, начиная с версии 5.2.0, поддержка JSON включена в ядро в виде функций json_decode() и json_encode(), которые сами преобразуют типы данных JSON в соответствующие типы PHP и наоборот.
Синтаксис
JSON-текст представляет собой (в закодированном виде) одну из двух структур:
- Набор пар ключ:значение. В различных языках это реализовано как объект, запись, структура, словарь, хэш-таблица, список с ключом или ассоциативный массив. Ключом может быть только строка, значением — любая форма.
- Упорядоченный набор значений. Во многих языках это реализовано как массив, вектор, список или последовательность.
Это универсальные структуры данных: как правило, любой современный язык программирования поддерживает их в той или иной форме. Они легли в основу JSON, так как он используется для обмена данными между различными языками программирования.
В качестве значений в JSON используются структуры:
- Объект — это неупорядоченное множество пар ключ:значение, заключённое в фигурные скобки "{ }". Ключ описывается строкой, между ним и значением стоит символ ":". Пары ключ-значение отделяются друг от друга запятыми.
- Массив (одномерный) — это упорядоченное множество значений. Массив заключается в квадратные скобки "[ ]". Значения разделяются запятыми.
- Значение может быть строкой в двойных кавычках, числом, объектом, массивом, одним из литералов: true, false или null. Т.о. структуры могут быть вложены друг в друга.
- Строка — это упорядоченное множество из нуля или более символов юникода, заключенное в двойные кавычки. Символы могут быть указаны с использованием escape-последовательностей, начинающихся с обратной косой черты "\".
Строка очень похожа на одноимённый тип данных в языках С и Java. Число тоже очень похоже на С- или Java-число, за исключением того, что используется только десятичный формат. Пробелы могут быть вставлены между любыми двумя синтаксическими элементами.
Следующий пример показывает JSON-представление объекта, описывающего человека. В объекте есть строковые поля имени и фамилии, объект, описывающий адрес, и массив, содержащий список телефонов.
Основные методы для работы с JSON в JavaScript — это:
- JSON.parse — читает объекты из строки в формате JSON.
- JSON.stringify — превращает объекты в строку в формате JSON, используется, когда нужно из JavaScript передать данные по сети.
1. Знакомство с методом JSON.parse
Создадим базовое web-приложение Tizen и назовем его json1.
Введем в файле index.html следующий код:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0">
<meta name="description" content="Tizen basic template generated by Tizen Web IDE"/>
<title>Tizen Web IDE - Tizen - Tizen basic Application</title>
<link rel="stylesheet" type="text/css" href="css/style.css"/>
<script src="js/main.js"></script>
<script type="text/javascript">
var numbers = "[0, 1, 2, 3, 4, 5, 6]";
numbers = JSON.parse(numbers);
document.write(numbers);
</script>
</head>
<body>
</body>
</html>
Немного изменим код нашего сценария:
<script type="text/javascript">
var numbers = "[0, 1, 2, 3, 4, 5, 6]";
numbers = JSON.parse(numbers);
document.write(numbers[2]);
</script>
Рассмотрим более интересный случай:
<script type="text/javascript">
var user = '{ "name": "Вася", "age": 35, "isAdmin": true, "friends": ["Миша","Маша","Гриша","Гульшат"] }';
user = JSON.parse(user);
strMessage = "Имя: " + user.name + "<br>" + "Возраст: " + user.age + "<br>" + "Администратор: " + user.isAdmin + "<br>" + "Друзья: " + user.friends + "<br>";
document.write(strMessage);
</script>
2. Создание объекта из строки JSON
Этот пример был позаимствован с сайтаhttp://www.w3schools.com/js/js_validation.asp. Создадим проект json2. В файле index.tml введем следующий код.
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0">
<meta name="description" content="Tizen basic template generated by Tizen Web IDE"/>
<title>Create Object from JSON String</title>
<link rel="stylesheet" type="text/css" href="css/style.css"/>
<script type="text/javascript">
var text = '{"employees":[' +
'{"firstName":"John","lastName":"Doe" },' +
'{"firstName":"Anna","lastName":"Smith" },' +
'{"firstName":"Peter","lastName":"Jones" }]}';
obj = JSON.parse(text);
var n=obj.employees.length;
strMessage="";
for(i=0;i<n;i++)
{
strMessage += "<h2>" + obj.employees[i].firstName + " " + obj.employees[i].lastName + "</h2>";
}
document.write(strMessage);
</script>
</head>
<body>
</body>
</html>
3. Работа с методом JSON.parse
В следующем примере используется JSON.parse для преобразования строки JSON в объект (проект json3).
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0">
<meta name="description" content="Tizen basic template generated by Tizen Web IDE"/>
<title>Tizen Web IDE - Tizen - Tizen basic Application</title>
<link rel="stylesheet" type="text/css" href="css/style.css"/>
<script src="js/main.js"></script>
<script type="text/javascript">
var jsontext = '{"countryname":"Россия","population":"143.5 миллиона","cities":["Москва","Санкт-Петербург","Казань","Уфа","Новосибирск"]}';
var contact = JSON.parse(jsontext);
var strMessages = contact.countryname + ", " + contact.population + "<br>";
strMessages +="Города: " + "<br>";
var n=contact.cities.length;
for(i=0;i<n;i++)
{
strMessages += contact.cities[i] + "<br>";
}
document.write(strMessages);
</script>
</head>
<body>
</body>
</html>
4. Работа с функций reviver
Функция reviver часто используется для преобразования представления JSON строк дат Международной организации по стандартизации (ISO) в объекты Date в формате универсального времени (UTC). В этом примере используется JSON.parse для десериализации строки даты в формате ISO. Функция dateReviver возвращает объекты Date для членов, отформатированных как строки даты ISO. Предлагается немного переделанный пример, взятый с сайтаhttps://msdn.microsoft.com/ru-ru/library/cc836466%28v=VS.94%29.aspx?f=255&MSPPError=-2147217396. Создадим проект json4.
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0">
<meta name="description" content="Tizen basic template generated by Tizen Web IDE"/>
<title>Tizen Web IDE - Tizen - Tizen basic Application</title>
<link rel="stylesheet" type="text/css" href="css/style.css"/>
<script src="js/main.js"></script>
<script type="text/javascript">
var jsontext = '{ "hiredate": "1998-09-01T12:00:00Z", "birthdate": "1967-01-07T12:00:00Z" }';
var dates = JSON.parse(jsontext, dateReviver);
var strMessage ="День рождения: " + "<br>" + dates.birthdate.toUTCString() + "<br>";
strMessage += "Дата приема на работу: " + "<br>" + dates.hiredate.toUTCString();
document.write(strMessage);
function dateReviver(key, value) {
var a;
if (typeof value === 'string') {
a = /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)Z$/.exec(value);
if (a) {
return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4],
+a[5], +a[6]));
}
}
return value;
};
</script>
</head>
<body>
</body>
</html>
5. Функция JSON.stringify
Эта функция преобразует значение JavaScript в строку JSON (нотация объектов JavaScript).
JSON.stringify(value [, replacer] [, space])
В этом примере метод JSON.stringify преобразует объект contact в текст JSON. Массив memberfilter задан так, что преобразуются только члены surname и phone. Член firstname пропускается. Создадим проект json5.
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0">
<meta name="description" content="Tizen basic template generated by Tizen Web IDE"/>
<title>Tizen Web IDE - Tizen - Tizen basic Application</title>
<link rel="stylesheet" type="text/css" href="css/style.css"/>
<script src="js/main.js"></script>
<script type="text/javascript">
var contact = new Object();
contact.firstname = "Jesper";
contact.surname = "Aaberg";
contact.phone = ["555-0100", "555-0120"];
var memberfilter = new Array();
memberfilter[0] = "surname";
memberfilter[1] = "phone";
var jsonText = JSON.stringify(contact, memberfilter, "\t");
document.write(jsonText);
</script>
</head>
<body>
</body>
</html>







