Обычно JSON используется для обмена данными с сервером.
При получении с сервера данные всегда передаются в виде строки.
Если обработать эти данные при помощи функции JSON.parse(), то они станут объектом JavaScript.
Парсинг данных JSON
Представьте, что с сервера мы получили такой текст:
'{ "name":"John", "age":30, "city":"New York"}'
Используем JavaScript функцию JSON.parse(), чтобы преобразовать этот текст в объект JavaScript:
var obj = JSON.parse('{ "name":"John", "age":30, "city":"New York"}');
Внимание! Убедитесь, что преобразуемый текст записан в формате JSON, иначе вы получите ошибку синтаксиса.
Используем полученный объект JavaScript на странице:
<p id="demo"></p>
<script>
document.getElementById("demo").innerHTML = obj.name + ", " + obj.age;
</script>
Получение данных JSON с сервера
Получить данные JSON с сервера можно, например, используя запрос AJAX.
Так как ответ сервера записан в формате JSON, вы можете преобразовать строку в объект JavaScript.
В следующем примере используется XMLHttpRequest, чтобы получить данные с сервера:
var xmlhttp = new XMLHttpRequest();
xmlhttp.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
var myObj = JSON.parse(this.responseText);
document.getElementById("demo").innerHTML = myObj.name;
}
};
xmlhttp.open("GET", "json_demo.txt", true);
xmlhttp.send();
См. файл json_demo.txt
Массивы как данные JSON
Если функция JSON.parse() используется для парсинга данных JSON, полученных из массива, то будет возвращен массив JavaScript, а не объект.
В следующем примере возвращенные с сервера данные JSON являются массивом:
var xmlhttp = new XMLHttpRequest();
xmlhttp.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
var myArr = JSON.parse(this.responseText);
document.getElementById("demo").innerHTML = myArr[0];
}
};
xmlhttp.open("GET", "json_demo_array.txt", true);
xmlhttp.send();
См. файл json_demo_array.txt
Парсинг дат
Объекты даты и времени (тип Date) нельзя использовать в JSON.
Если вам необходимо включить в данные дату, записывайте ее как строку.
Когда это потребуется, вы сможете преобразовать ее обратно в объект:
var text = '{ "name":"John", "birth":"1986-12-14", "city":"New York"}';
var obj = JSON.parse(text);
obj.birth = new Date(obj.birth);
document.getElementById("demo").innerHTML = obj.name + ", " + obj.birth;
Либо можно воспользоваться вторым параметром функции JSON.parse().
В качестве второго параметра передается функция, которая проверяет каждое свойство перед тем, как вернуть его значение.
В следующем примере строка преобразуется в объект даты, при помощи второго параметра JSON.parse():
var text = '{ "name":"John", "birth":"1986-12-14", "city":"New York"}';
var obj = JSON.parse(text, function (key, value) {
if (key == "birth") {
return new Date(value);
} else {
return value;
}});
document.getElementById("demo").innerHTML = obj.name + ", " + obj.birth;
Парсинг функций
Функции нельзя использовать в JSON.
Если вам необходимо включить в данные функцию, записывайте ее как строку.
Когда это потребуется, вы сможете преобразовать ее обратно в функцию:
var text = '{ "name":"John", "age":"function () {return 30;}", "city":"New York"}';
var obj = JSON.parse(text);
obj.age = eval("(" + obj.age + ")");
document.getElementById("demo").innerHTML = obj.name + ", " + obj.age();
Внимание! Следует избегать использования функций в JSON, так как в этом случае теряется их область видимости, а для обратного преобразования приходится использовать функцию eval(), что нежелательно.
Поддержка браузерами
Функция JSON.parse() включена во все основные браузеры и в последний стандарт ECMAScript (JavaScript).
Для более старых браузеров существует специальная библиотека JavaScript https://github.com/douglascrockford/JSON-js.