json — вопросы с ответами

Формат данных JavaScript Object Notation (JSON) позволяет приложениям обмениваться данными по сети, обычно через API RESTful. JSON является технологически независимым, непатентованным и портативным форматом. Все современные языки (например, Java, JavaScript, Ruby, C#, PHP, Python и Groovy) и платформы обеспечивают отличную поддержку для создания (сериализации) и потребления (десериализации) данных JSON. JSON прост: он состоит из удобных для разработчиков конструкций, таких как Objects, Arrays и пары имя/значение. JSON не ограничивается передачей представительского состояния (REST); он также взаимодействует с:

  • Node.js (который хранит метаданные проекта в package.json);
  • Базы данных NoSQL, такие как MongoDB;
  • Платформы обмена сообщениями, такие как Kafka.

Связь с JavaScript

Возрождение JavaScript повышает популярность JSON. За последние несколько лет мы увидели рост JavaScript как первоклассного языка разработки и среды. Эта экосистема включает в себя такие платформы, как Node.js и Mode/View/Controller (MVC), а также AngularJS, React, Backbone и Ember. Также значительно увеличилось количество книг и веб-сайтов, демонстрирующих лучшие работы в JavaScript Objects и Patterns. По словам Дугласа Крокфорда, JSON является подмножеством нотации JavaScript Object Literal и легко вписывается в разработку JavaScript.

Тысячи RESTful API используют JSON. Примерный список популярных API-интерфейсов RESTful на основе JSON включает следующее: LinkedIn, Twitter, Facebook, Salesforce, GitHub, DropBox, Tumblr, Amazon Web Services (AWS).

Чтобы увидеть тысячи доступных API REST на основе JSON, посетите ProgrammableWeb и выполните поиск по REST и JSON. Затем вам придется потратить еще несколько недель, чтобы просмотреть все результаты.

Отличия от JavaScript Object

Как видно из названия, JSON более или менее является объектом JavaScript. Но есть и различия. Прежде всего, как объясняется в спецификации, «JSON – это текстовый формат, который облегчает обмен структурированными данными между всеми языками программирования». Так что он универсален, это не просто JavaScript. На самом деле, это вообще не часть JavaScript, а просто то, как пишутся объекты JavaScript.

С точки зрения самого синтаксиса, есть несколько основных отличий. Во-первых, все имена (ключи) представляются в виде строк (то есть они должны быть в кавычках). Другая область, в которой JSON отличается от объектов JavaScript, – это типы значений, которые JSON может хранить.

Также важно отметить, что весь бит JSON сам по себе является единственным допустимым объектом JSON, а сам тип объекта является способом вложения объектов JSON в значения, аналогично тому, как это делается с объектами в JavaScript.

Место на рынке и отличия от XML

JSON прост и постепенно заменяет XML в качестве основного формата обмена данными в Интернете. JSON легко читается, а его структуры легко переводятся в концепции, хорошо понятные разработчикам программного обеспечения – массивы, объекты и пары имя/значение. Нам больше не нужно чесать голову или спорить о том, что должно быть Элементом или Атрибутом. Объекты и их элементы данных гораздо лучше подходят для объектно-ориентированного проектирования и разработки. Документ, отформатированный в JSON, обычно меньше такого же XML-эквивалента, потому что JSON имеет меньше накладных расходов и более компактен. Это связано с отсутствием начальных и конечных тегов, окружающих каждый элемент данных. Таким образом, на уровне предприятия JSON более эффективен для обработки, чем XML, поскольку документы JSON могут передаваться по сети и обрабатываться быстрее, чем их аналоги в XML.

Хотя Дуглас Крокфорд (создатель этого формата) изначально предполагал, что JSON будет форматом обмена данными (обычно с REST), в настоящее время JSON находит место в файлах конфигурации для широко используемых продуктов, таких как Node.js и Sublime Text. Node.js имеет файл package.json, который он использует для определения своей стандартной структуры пакета npm. Sublime Text, популярная среда разработки в сообществе веб-разработчиков, использует JSON для настройки своего внешнего вида вместе со своими менеджерами пакетов.

Где хранится JSON?

Как вы, наверное, догадались, поскольку JSON – это в основном просто текст, вы можете в значительной степени хранить его так, как хотите. Вы можете сохранить его в базе данных, в отдельном текстовом файле, в хранилище клиента (например, куки или localStorage) или даже использовать собственный формат файла, используя расширение файла .json (в основном это просто текстовый файл с расширением .json).

После того, как вы сохранили контент в формате JSON, достаточно просто извлечь его и правильно проанализировать. Существуют разные способы получения и анализа JSON в зависимости от выбранного языка.

Структура JSON

Базовый формат данных JSON включает типы данных и значений JSON. Мы также рассмотрим версии, комментарии и типы файлов/MIME.

JSON имеет следующие основные типы данных:

  1. Пара имя (или ключ)/значений – состоит из ключа (атрибута данных) и значения.
  2. Объект – хаотичная коллекция пар имя/значение.
  3. Массив – коллекция упорядоченных значений.

Пары имя/значение

{

"conference": "OSCON",

"speechTitle": "JSON at Work",

"track": "Web APIs"

}

Пары имя/значение имеют несколько характеристик. Каждое имя (например, "conference") находится на левой стороне колонки (:), а строка в целом должна начинаться и заканчиваться с кавычек. Значение (например, "OSCON") находится справа от двоеточия. В предыдущем примере типом значения является String, но есть и несколько других типов значений.

Объекты

Объекты состоят из пар имя/значение. Они также имеют свои характеристики. Начинаются с левой фигурной скобки ({) и заканчиваются правой фигурной скобкой (}). Состоят из разделенных запятыми несортированных связок имя/значение. Скобки могут не иметь содержания {}. Могут быть интегрированной частью других Объектов или Массивов.

Массивы

Согласно своим характеристикам, Массивы начинаются с левой скобки ([) и имеют конечную правую скобку (]). Состоят из разделенных запятыми упорядоченных значений. Могут быть пустыми, []. Могут быть интегрированы в состав других массивов или объектов. Индексирование начинается с 0 или 1.

Версии JSON

По словам Дугласа Крокфорда, другой базовой версии стандарта JSON никогда не будет. Это не потому, что JSON совершенен; ничто не идеально. Цель единственной версии JSON состоит в том, чтобы избежать ловушек с совместимостью. Когда вам нужно поддерживать обратную совместимость с предыдущими версиями. Крокфорд считает, что новый формат данных должен заменить JSON, когда возникнет необходимость в сообществе разработчиков.

Комментарии в JSON

В документах JSON нет комментариев, и точка. Согласно некоторым интервью, разработчики изначально планировали добавить комментарии, но отказались от этой идеи на ранних стадиях разработки по следующим причинам:

  1. Комментарии не так уж полезны.
  2. У парсеров JSON возникли трудности с поддержкой комментариев.
  3. Люди злоупотребляли комментариями. Например, они могли использовать комментарии для разбора директив, что разрушило бы совместимость.
  4. Отказ от комментариев упростил разработку и сделал возможной межплатформенную поддержку JSON.

Архитектурный стиль

Архитектурный стиль JSON основан на концепции noBackend. С noBackend разработчику не нужно беспокоиться о первоочередных задачах серверов приложений или баз данных на ранних стадиях разработки приложений.

Архитектура noBackEnd, позволяет сосредоточиться на приложении с точки зрения бизнеса (прежде всего служб и данных), чтобы была возможность поддерживать не только клиенты на основе пользовательского интерфейса (например, мобильные устройства, планшеты и веб-сайты), но и API а также клиентские приложения без веб-интерфейса. Самыми простыми инструментами для развертывания данных являются json-server для эмуляции RESTful API. Выбирая этот подход, вы используете интерфейсный подход к проектированию и созданию API, который обеспечивает следующее:

Позволяет моделировать документ JSON как Объект, Массив и пару имя/значение;

Упрощает быструю генерацию текста для документа JSON итеративным способом.

Особенности JSONP

JSONP – это решение, которое пытается преодолеть ограничения между источниками, связанными с получением данных с другого сервера. Возможно, вы уже сталкивались с этим при попытке использовать Ajax для запроса данных из внешнего источника. Проще говоря, вы не можете сделать это по соображениям безопасности.

В качестве решения этой проблемы Боб Ипполито впервые предложил JSONP еще в 2005 году, вскоре после того, как Джордж Джемпти предложил нечто подобное под названием JSON++.

JSONP использует тот факт, что элементы <script> не связаны ограничениями между источниками. Вот почему мы можем без проблем связываться со скриптами на удаленных CDN. Вот пример, который обращается к данным JSONP с использованием простого JavaScript:

Этот код создает элемент <script>, добавляет указанный URL-адрес в качестве атрибута src, а затем добавляет скрипт в документ. В этом случае мы обращаемся к данным конкретного пользователя на GitHub, используя API GitHub. Если вы откроете демонстрационную версию, вы увидите отображение данных JSON в консоли.

Если вы используете jQuery, вы можете сделать аналогичный запрос, используя метод $.getJSON():

Обратите внимание, что в этом случае нам нужны именно те данные, которые возвращаются. Однако в обычной версии JavaScript нам нужно углубиться в свойство data, чтобы получить нужные данные JSON. В любом случае, после получения результирующих данных, мы можем использовать обозначение точки, для доступа к различным парам имя/значение.

Как работает JSONP?

Чтобы понять, как работает JSONP, вы должны сначала понять, что простой файл JSON нельзя использовать таким образом, если сервер не настроит данные для правильного ответа. Другими словами, вы не можете сделать это с любым внешним файлом .json, который вы найдете в интернете. Итак, как метод JSONP решает эту проблему?

В предыдущем примере JavaScript вы, вероятно, заметили, что к URL GitHub API был прикреплен параметр: callback=doJSONP. Это функция обратного вызова, которая действует как обертка (или "заполнение"), которая обеспечивает доступ к данным, потому что обычно, когда вы вводите данные JSON с помощью элемента <script>, она ничего не делает, потому что содержимое не хранится в переменной, которая может быть доступна в вашем JavaScript.

Поэтому, когда вы настраиваете JSON для доступа на удаленном сервере, вы должны убедиться, что он отправляется с заполнением (то есть функцией-оберткой).

13 ответов
После создания массива NumPy и сохранения его как переменной контекста Django, я получаю следующую ошибку при загрузке веб-страницы: array([ 0, 239, 479, 717, 952, 1192, 1432, 1667], dtype=int64) is not JSON serializable Что это значит?
30 окт. 2014, в 04:54
8 ответов
Недавно я переключился с Django 1.6 на 1.7, и начал использовать миграции (я никогда не использовал Юг). До 1.7 я загружал исходные данные в файл fixture/initial_data.json, который был загружен командой python manage.py syncdb (при создании базы данных). Теперь я начал использовать миграции, и это п...
migration
data-migration
21 сен. 2014, в 15:28
13 ответов
Я получаю странную ошибку, используя json_decode(). Он правильно декодирует данные (я видел его с помощью print_r), но когда я пытаюсь получить доступ к информации внутри массива, я получаю: Fatal error: Cannot use object of type stdClass as array in C:\Users\Dail\software\abs.php on line 108 Я тол...
25 июль 2011, в 12:41
13 ответов
Я хочу использовать Python для преобразования данных JSON в объект Python. Я получаю объекты данных JSON из API Facebook, которые хочу сохранить в моей базе данных. Мой текущий вид в Django (Python) (request.POST содержит JSON): response = request.POST user = FbApiUser(user_id = response['id']) user...
05 июль 2011, в 08:15
20 ответов
Я создаю PHP script, который передает данные JSON в другой script. Мой script строит данные в большой ассоциативный массив, а затем выводит данные с помощью json_encode. Вот пример script: $data = array('a' => 'apple', 'b' => 'banana', 'c' => 'catnip'); header('Content-type: text/javascript...
pretty-print
19 май 2011, в 06:30
27 ответов
Мне нужен действительно быстрый метод проверки, является ли строка JSON или нет. Я чувствую, что это не лучший способ: function isJson($string) { return ((is_string($string) && (is_object(json_decode($string)) || is_array(json_decode($string))))) ? true : false; }...
error-handling
json-deserialization
jsonresult
18 май 2011, в 09:23
15 ответов
Я загружаю JSON файл из онлайн-источника, и когда он проходит через цикл, я получаю эту ошибку: Неустранимая ошибка: максимальное время выполнения 30 секунд превышено в C:\wamp\www\temp\fetch.php в строке 24
02 март 2011, в 07:39
9 ответов
Я пытаюсь декодировать строку JSON в массив, но я получаю следующую ошибку. Неустранимая ошибка: нельзя использовать объект типа stdClass как массив в C:\wamp\www\temp\asklaila.php on line 6 Вот код: <?php $json_string = 'http://www.domain.com/jsondata.json'; $jsondata = file_get_contents($jso...
arrays
02 март 2011, в 05:56
17 ответов
Я попытался разобрать файл JSON с помощью PHP. Но я застрял сейчас. Это содержимое моего файла JSON: { "John": { "status":"Wait" }, "Jennifer": { "status":"Active" }, "James": { "status":"Active", "age":56, "count":10, "progress":0....
03 дек. 2010, в 08:53
15 ответов
Я хочу вернуть JSON из PHP script. Я просто повторяю результат? Должен ли я устанавливать заголовок Content-Type?
header
31 окт. 2010, в 16:57
14 ответов
Я пытаюсь преобразовать ответ Ajax на стороне сервера script в Django HttpResponse, но, видимо, он не работает. Это серверная сторона script: /* RECEIVE VALUE */ $validateValue=$_POST['validateValue']; $validateId=$_POST['validateId']; $validateError=$_POST['validateError']; /* RETURN VALUE */ $arr...
11 март 2010, в 19:37
12 ответов
Я пытаюсь обрабатывать входящие запросы JSON/Ajax с помощью Django/Python. request.is_ajax() является True в запросе, но я понятия не имею, где полезная информация связана с данными JSON. request.POST.dir содержит следующее: ['__class__', '__cmp__', '__contains__', '__copy__', '__deepcopy__', '__d...
content-type
30 июль 2009, в 16:54
18 ответов
Мне нужно сохранить многомерный ассоциативный массив данных в плоском файле для целей кеширования. Иногда мне приходилось переходить на JSON для использования в моем веб-приложении, но в большинстве случаев я буду использовать массив непосредственно в PHP. Будет ли более эффективным хранить массив к...
arrays
performance
serialization
29 апр. 2009, в 20:00
12 ответов
Существует много документации о том, как сериализовать модель QuerySet, но как вы просто сериализуете в JSON поля экземпляра модели?
django-models
serialization
16 апр. 2009, в 16:16
21 ответ
Как использовать функцию json_encode() с результатами запросов MySQL? Нужно ли выполнять итерацию по строкам или я могу просто применить его ко всему объекту результатов?
20 дек. 2008, в 20:05
Наверх
Меню