css, html, php, javascript, jQuery, ajax … – решения, примеры, рецепты
28 Фев
JSON (JavaScript Object Notation – представление объектов JavaScript) – легкий формат представления данных, основанный на подмножестве синтаксиса JavaScript, а точнее на литералах массивов и объектов. JSON – это альтернатива традиционным форматам (обычный текст или XML), которые используются при обмене данными между сервером и клиентом. В отличие от XML и XML-совместимых языков, которые требуют синтаксического анализа, определения JSON могут быть просто включены в сценарии JavaScript. Формат JSON предложен программистом Дугласом Крокфордом (Douglas Crockford).
Может я зайду издалека, но для того чтобы действительно понять JSON, сначала поймем (вспомним) синтаксис массивов и объектов в литеральной нотации JavaScript.
Массивы как литералы
Массив в JavaScript можно определить с помощью конструктора Array, например так:
var aData = new Array("строка", true, 43, null);
В JavaScript массивы нетипизированные, поэтому в них можно хранить различные типы данных. В примере массив содержит строку, логическое значение, число и значение null.
Массив же, описываемый как литерал, можно определить с помощью квадратных скобок, внутри – значения элементов массива, через запятую. Вот как будет выглядеть тот же самый массив, но в литеральной нотации:
var aData = ["строка", true, 43, null];
Обращаться к отдельным элемента массива можно указывая имя массива и номер элемента:
alert(aData[0]); alert(aData[1]);
Объекты как литералы
Объекты в JavaScript определяются с помощью конструктора Object, например так:
var oAuto = new Object(); oAuto.firm = "Audi"; oAuto.model = "A6"; oAuto.year = 2008; oAuto.price = 78000;
Тот же самый код, но в литеральной нотации будет выглядеть так:
var oAuto = {
"firm":"Audi",
"model":"A6",
"year":2008,
"price":78000
};
Этот код создает объект со свойствами firm, model, year и price и обращаться к ним можно таким образом:
alert(oAuto.model); alert(oAuto.year);
но можно использовать и синтаксис массивов обращаясь к свойствам объекта таким образом:
alert(oAuto["model"]); alert(oAuto["year"]);
В литеральной нотации описания массивов и объектов можно вкладывать друг в друга, создавая таким образом объект массивов или массив объектов. Посмотрите этот код:
var aAuto = [
{
"firm":"BMW",
"model":"X5",
"year":2007,
"price":99000
},
{
"firm":"Audi",
"model":"A6",
"year":2008,
"price":78000
},
{
"firm":"Volkswagen",
"model":"Touareg 7L",
"year":2006,
"price":45000
}
];
Мы создали массив aAuto, который содержит три объекта. Комбинируя синтаксис обращения к массивам с синтаксисом обращения к объектам попробуем получить год выпуска второго автомобиля:
alert(aAuto[1].year); // получаем 2008
Можно сделать наоборот, и описать объект массивов:
var oAuto = {
"firm":["BMW", "Audi", "Volkswagen"],
"model":["X5", "A6", "Touareg 7L"],
"year":[2007, 2008, 2006],
"price":[99000, 78000, 45000]
};
в этом случае обращаемся сначала к объекту, а затем к массиву внутри него:
alert(oAuto.year[1]); // получаем 2008
Вот такое длинное получилось предисловие, но зато теперь будет гораздо понятнее при чем здесь вообще JSON…
JSON – комбинация массивов и объектов и предназначен только для хранения данных. Как следствие, JSON не может иметь переменных и не допускает никаких операций над ними. Давайте попробуем записать предыдущий пример, используя синтаксис JSON:
{
"firm":["BMW", "Audi", "Volkswagen"],
"model":["X5", "A6", "Touareg 7L"],
"year":[2007, 2008, 2006],
"price":[99000, 78000, 45000]
}
Обратите внимание, что пропали имя переменной и точка-запятая. Передача такого объекта с использованием HTTP-протокола будет происходить очень быстро, поскольку содержит минимум символов. Получив такие данные на стороне клиента и записав ее в какую-либо переменную (например sData) мы получаем строку информации.
Обратите внимание: именно строку, а совсем не объект или объект с вложенными в него массивами. Преобразуем строку в объект, используя функцию eval().
var oAuto = eval("(" + sData + ")");
В результате этого получится объект, который мы описали чуть выше.
Преимущество JSON перед XML
Так в чем же все-таки состоит преимущество JSON перед XML?
Здесь речь идет исключительно о преимуществах и недостатках только лишь с точки зрения организации обмена данными в Сети.
В том, что язык XML оказывается очень избыточным при сравнении с JSON. Давайте убедимся в этом на простом примере. Одни и те же данные представим в формате XML и в формате JSON.
<general>
<cars>
<car>
<firm>BMW</firm>
<model>X5</model>
<year>2007</year>
<price>99000</price>
</car>
<car>
<firm>Audi</firm>
<model>A6</model>
<year>2008</year>
<price>78000</price>
</car>
<car>
<firm>Volkswagen</firm>
<model>Touareg 7L</model>
<year>2006</year>
<price>45000</price>
</car>
</cars>
</general>
так это выглядит в формате XML, а ниже – в формате JSON:
{ "general":
{
"cars":[
{
"firm":"BMW",
"model":"X5",
"year":2007,
"price":99000
},
{
"firm":"Audi",
"model":"A6",
"year":2008,
"price":78000
},
{
"firm":"Volkswagen",
"model":"Touareg 7L",
"year":2006,
"price":45000
}
]
}
}
При использовании формата JSON выигрыш составит 42 байта, а без учета пробелов и вовсе 86 байт. А если вспомнить еще и о том, что данные в формате JSON не требуют дополнительного синтаксического анализа на стороне клиента – преимущество JSON перед XML в аспекте передачи данных от сервера клиенту становится очевидным…
По этой теме могу порекомендовать прочитать переводную статью JSON и XML. Что лучше? на Хабрахабре, а я надеюсь, что мне удастся в ближайшем будущем подробнее рассказать о утилитах для работы с JSON как на стороне клиента, так и на стороне сервера.
Отзывов (30) на «Что такое JSON?»
Вот эту статью да пораньше найти, а то обрывки да кусочки везде. В общем краткость и наглядность у вас на высоте… Ваш блог радует глаз, ну еще TermiT’s блог – молодчаги.
очень хорошая статья.
Спасибо
Где я был раньше. Как раз есть необходимость с помощью Аякс принимать от сервера массивы и выводить их на экран. За парсинг XML браться не очень хочется, а формат JSON как раз то что нужно. Спасибо.
Хм, как для начинающего программера-вполне доступно!
Отличная статья. А я-то искал где-нибудь алгоритм для преобразования JSON-строки в объект = )
а через что это все можно открытЬ?
>>> а через что это все можно открытЬ?
Даже не знаю, что и ответить Вам… Ну, попробуйте через браузер….
{ «general»:
} <—- очепятка?
«cars»:[
Да. Конечно. Скобка должна открываться в этом месте…
Молодец! Очень толково написано!
Было бы неплохо если бы вот эта информация
… Преобразуем строку в объект, используя функцию eval().
var oAuto = eval("(" + sData + ")");...была поменяна на что-то вроде этого:
//справа строка принятая от сервера var sData='{"firm":["BMW", "Audi", "Volkswagen"],"model":["X5", "A6", "Touareg 7L"],"year":[2007, 2008, 2006],"price":[99000, 78000, 45000]}'; var oAuto = eval("(" + sData + ")"); alert(oAuto.price[0]); alert(oAuto['price'][2]);ну так чтоб больше наглядности для новичков было!
Да, кстати, мой код работать не будет, т.к. серверный скрипт поменял все ровные кавычки на неровные(‘,» «)!
Это работа движка WP или откуда такая недоработка?
Подскажите пожалуйста как осуществить загрузку данных из фала… Буду очень благодарен!
Может быть Вам стоит немного уточнить свой вопрос? Просто не очень ясно на что именно отвечать…
Добрый день, Gennady. XML и JSON очень удобные форматы для передачи атомарных значений. А вот как лучше поступить, если мне нужно обновить на странице 2-3 куска HTML ? Зашить куски HTML в XML (или JSON) в качестве значений это нормально ? Или есть другие предназначеные для этого методы ?
В передаче данных с помощью ajax совсем не обязательно использовать именно XML или тот же JSON. Вы совершенно спокойно можете передавать и просто текст и HTML-код и JS-код. Что Вам отдаст сценарий на стороне сервера, то Вы и примете на клиенте. Просто это надо должным образом обработать и поместить в нужное место.
Спасибо. Да. Но принять 1 кусок HTML – это просто.
А для двух – нужен контейнер.
Например $ответ = HTML1 . раделитель . HTML2.
А потом на строне клиента разбить ответ (строку) по разделителю и получить массив HTML’ок – далее каждую вставить в свое место.
Либо зашить в json или XML.
Вот вопрос и был – каким способом лучше …
Пока что вариант с JSON – удобнее. Получается наглядно response.header чем response[0].
Но как я понял большенство людей не работает с AJAX для приема более чем 1 куска HTML
Передавать HTML с помощью JSON имхо извращение, зачем? Какой выигрыш?
Куски HTML через разделитель, на клиенте разбиваем данные, каждый кусок ставим в нужное место.
Думаю, можно было бы еще про возможные проблемы с безопасностью сказать (имею в виду слепое использование eval без эскэйпинга). Спасибо, неплохая статья.
А как из javascript объекта получить json без лишних телодвижений?
o ={ name:’nameValue’,values:['value1','value2']}
=>
{«name»:»nameValue»,»values»:["value1","value2"]}
именно строкой…
Мне кажется, есть простое решение, но че-то не могу додуматься)
Если не читали Как работать с JSON? – почитайте. Правда учитывайте, что статья в общем давнишняя, но поможет разобраться.
Дело в том, что если Вы получаете в клиент данные в формате json – это и есть объект javascript (json – JavaScript Object Notation) и работать с ним можно как с обычным объектом..
Спасибо. Теперь я понял что такое JSON!!! А то читал другие статьи и никак не мог понять.
Спасиб.
var oAuto = eval(«(» + sData + «)»);
вот здесь не понял, зачем плюсовать скобки по краям?
всегда ли так нужно делать?
Спасибо большое!), то что нужно, ловите +1 к морали)!
ценю таких людей, большое спасибо
Замечательная статья
Присоединяюсь к вопросу Дмитрия (22).
Поясните, пожалуйста, зачем аргумент eval компоновать из строки в формате JSON и скобок?
Мой вопрос проистекает, наверное, из непонимания, почему в принципе eval() может быть использован для этой цели.
Заранее спасибо.
Поможет разобраться статья в Вики – JSON.
Нужная глава – Вопросы безопасности.
Просто когда будете читать, учитывайте тот факт, что мой пост был написал 2,5 года назад….
[...] моему выбору, то милости прошу читать эти две статьи: Что такое JSON? и JSON и XML. Что лучше?. С контейнером разобрались, [...]
Почему бы не представить xml в виде атрибутов и сравнить размер с json:
[...] более, что формат прост, как все гениальное. Но одну ссылку все-таки укажу – уж больно статья хороша – [...]
Спасибо большое за статью и за блог вообще, много полезного для себя нашел.
Оставьте отзыв