Опубликован: 12.12.2015 | Доступ: свободный | Студентов: 665 / 96 | Длительность: 15:42:00
Лекция 27:

Работа с данными в формате JSON

< Лекция 26 || Лекция 27

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-текст представляет собой (в закодированном виде) одну из двух структур:

  1. Набор пар ключ:значение. В различных языках это реализовано как объект, запись, структура, словарь, хэш-таблица, список с ключом или ассоциативный массив. Ключом может быть только строка, значением — любая форма.
  2. Упорядоченный набор значений. Во многих языках это реализовано как массив, вектор, список или последовательность.

Это универсальные структуры данных: как правило, любой современный язык программирования поддерживает их в той или иной форме. Они легли в основу JSON, так как он используется для обмена данными между различными языками программирования.

В качестве значений в JSON используются структуры:

  1. Объект — это неупорядоченное множество пар ключ:значение, заключённое в фигурные скобки "{ }". Ключ описывается строкой, между ним и значением стоит символ ":". Пары ключ-значение отделяются друг от друга запятыми.
  2. Массив (одномерный) — это упорядоченное множество значений. Массив заключается в квадратные скобки "[ ]". Значения разделяются запятыми.
  3. Значение может быть строкой в двойных кавычках, числом, объектом, массивом, одним из литералов: true, false или null. Т.о. структуры могут быть вложены друг в друга.
  4. Строка — это упорядоченное множество из нуля или более символов юникода, заключенное в двойные кавычки. Символы могут быть указаны с использованием 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>

Рис. 27.2.

Немного изменим код нашего сценария:

<script type="text/javascript">
    var numbers = "[0, 1, 2, 3, 4, 5, 6]";
    numbers = JSON.parse(numbers);
    document.write(numbers[2]);
    </script>

Рис. 27.3.

Рассмотрим более интересный случай:

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

Рис. 27.4.

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>

Рис. 27.5.

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>

Рис. 27.6.

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>

Рис. 27.7.

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>

Рис. 27.8.

Литература

< Лекция 26 || Лекция 27