Почему важен JSON? - PullRequest
       9

Почему важен JSON?

25 голосов
/ 29 апреля 2009

Я только недавно слышал о JSON (Javascript Object Notation). Кто-нибудь может объяснить, почему это считается (на некоторых сайтах / блогах / и т.д.) важным? У нас уже есть XML, почему JSON лучше (кроме того, что он «родной для Javascript»)?

Редактировать: Хм, основная тема ответа, кажется, «она меньше». Однако тот факт, что он позволяет извлекать данные из разных доменов, кажется мне важным. Или это на практике (пока) не используется?

Ответы [ 10 ]

19 голосов
/ 29 апреля 2009

XML имеет несколько недостатков:

  • Тяжело!
  • Он обеспечивает иерархическое представление контента, которое не совсем то же самое (но в значительной степени похоже на) объектную модель Javascript.
  • Javascript доступен везде. Без каких-либо внешних синтаксических анализаторов вы можете обрабатывать JSON напрямую с помощью интерпретатора JS.

Очевидно, что он не предназначен для полной замены XML. Для веб-приложений на основе JS его преимущества могут быть полезны.

13 голосов
/ 29 апреля 2009

JSON обычно намного меньше, чем его XML-эквивалент. Меньшая передача означает более быструю передачу, что приводит к улучшению взаимодействия с пользователем.

12 голосов
/ 29 апреля 2009

JSON гораздо более лаконичен. XML:

<person>
    <name>John Doe</name>
    <tags>
        <tag>friend</tag>
        <tag>male</tag>
   </tags>
</person>

JSON:

{"name": "John Doe", "tags": ["friend", "male"]}

Меньше перекрывающихся функций тоже. Например, в XML существует противоречие между выбором использования элементов (как указано выше) и атрибутов (<person name="John Doe">).

11 голосов
/ 29 апреля 2009

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

Допустим, вы пишете веб-сервис в домене A. Вы не можете загружать данные XML из домена B и анализировать их, потому что единственный способ сделать это - XMLHttpRequest, а XMLHttpRequest изначально был ограничен тем же источником политика общения только с URL-адресами в том же домене, что и содержащая страница.

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

(бонусный вопрос оставлен читателю в качестве упражнения: почему разрешен для доменов без согласия сервера, а XHR - нет?)

Конечно, возвращать , который состоит только из объектных литералов, бесполезно, потому что без присвоения значений какой-либо переменной вы ничего не можете с этим сделать. Таким образом, большинство служб используют вариант JSON, называемый JSONP (http://bob.pythonmac.org/archives/2005/12/05/remote-json-jsonp/).

С ростом популярности гибридных приложений люди поняли, что JSON является удобным форматом обмена данными в целом, особенно когда JavaScript является одним из концов канала. Например, JSON широко используется в Chromium даже в тех случаях, когда C ++ находится на обеих сторонах. Это просто удобный способ представления простых данных, для которых существуют хорошие парсеры во многих языках.

Забавно, но использование тегов для создания коллажей невероятно небезопасно, потому что это, по сути, намеренно XSS. Итак, нативный JSON (http://ejohn.org/blog/native-json-support-is-required/) должен был быть представлен, что устраняет первоначальные преимущества формата. Но к тому времени он уже был очень популярен:)

5 голосов
/ 30 апреля 2009

Если вы работаете в Javascript, нам, JSON, намного проще. Это связано с тем, что JSON может быть непосредственно оценен в объект Javascript, с которым гораздо проще работать, чем с DOM.

Заимствование и незначительное изменение XML и JSON сверху

XML:

<person>
    <name>John Doe</name>
    <tag>friend</tag>
    <tag>male</tag>
</person>

JSON:

{ person: {"name": "John Doe", "tag": ["friend", "male"]} }

Если вы хотите получить второй объект тега с XML, вам нужно использовать мощный, но многословный API DOM:

var tag2=xmlObj.getElementsByTagName("person")[0].getElementsByTagName("tag")[1];

Принимая во внимание, что с объектом Javascript, который пришел через JSON, вы можете просто использовать:

var tag2=jsonObj.person.tag[1];

Конечно, Jquery значительно упрощает пример DOM:

var tag2=$("person tag",xmlObj).get(1);

Однако JSON просто «вписывается» в мир Javascript. Если вы поработаете с ним какое-то время, вы обнаружите, что у вас гораздо меньше умственных затрат, чем при использовании данных на основе XML.

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

var tag2=(jsonObj.person && jsonObj.person.tags && jsonObj.person.tags.sort && jsonObj.person.tags.length==2 ? jsonObj.person.tags[1] : null);

(некоторым людям может не понравиться этот длинный троичный, но это работает). Но XML был бы (на мой взгляд) более противным (я не думаю, что вы захотите использовать троичный подход, потому что вы будете продолжать вызывать методы dom, которые, возможно, придется выполнять работу заново в зависимости от реализации): *

var tag2=null;
var persons=xmlObj.getElementsByTagName("person");
if(persons.length==1) {
    var tags=persons[0].getElementsByTagName("tag");
    if(tags.length==2) { tag2=tags[1]; }
}

JQuery (не проверено):

var tag2=$("person:only-child tag:nth-child(1)",xmlObj).get(0);
4 голосов
/ 29 апреля 2009
2 голосов
/ 29 апреля 2009

Это зависит от того, что вы собираетесь делать. Здесь много ответов, которые предпочитают JSON XML. Если вы посмотрите глубже, то большой разницы не будет.

Если у вас есть дерево объектов, вы получаете только дерево объектов javascript. Если вы посмотрите на напряжение, чтобы использовать доступ в стиле ООП, то снова оборачивается. Предположим, у вас есть объект типа A, B, C, который построен в дереве. Вы можете легко включить их сериализацию в JSON. Если вы прочитаете их обратно, вы получите только дерево объектов javascript. Чтобы восстановить ваши A, B, C, вы должны вручную сложить значения в созданные вручную объекты, или вы делаете некоторые хаки. Похоже на разбор XML и создание объектов? Ну да :) 1003 *

В настоящее время только новейшие браузеры имеют встроенную поддержку JSON. Для поддержки большего количества браузеров у вас есть два варианта: а) вы загружаете javasser в javascript, который поможет вам в разборе. Итак, как жир это звучит в отношении жирности? Другой вариант, как я часто вижу, это eval. Вы можете просто выполнить eval () для строки JSON, чтобы получить объекты. Но это вводит совершенно новый набор проблем безопасности. JSON указан, поэтому он не может содержать функции. Если вы не проверяете объекты на функцию, кто-то может легко отправить вам исполняемый код.

Так что это может зависеть от того, что вам больше нравится: JSON или XML. Самое большое различие - это, вероятно, способы доступа к вещам, будь то теги сценария XMLHTTPRequest ... Я бы решил, что использовать. По моему мнению, если бы в браузерах была надлежащая поддержка XPATH, я бы часто решал использовать XML. Но мода направлена ​​на json и загрузку дополнительных парсеров json в javascript.

Если вы не можете решить и знаете, что вам нужно что-то действительно мощное, вам стоит взглянуть на YAML. Читать о YAML очень интересно, чтобы лучше понять эту тему. Но это действительно зависит от того, что вы пытаетесь сделать.

1 голос
/ 29 апреля 2009

JSON - это текстовый формат сериализации объектов, более легкий, чем XML, который напрямую интегрируется с объектной моделью JavaScript. Это большинство его преимуществ прямо здесь.

Его недостатки (по сравнению с XML) примерно таковы: меньше доступных инструментов (забудьте о стандартной проверке и / или преобразовании, не говоря уже о выделении синтаксиса или проверке корректности в большинстве редакторов), с меньшей вероятностью удобочитаемы (Существуют огромные различия в удобочитаемости как JSON, так и XML, так что это обязательно нечеткое утверждение), тесная интеграция с JavaScript делает не очень тесную интеграцию с другими средами.

1 голос
/ 29 апреля 2009

JSON - это способ сериализации данных в объектах Javascript. Синтаксис взят из языка, поэтому он должен быть знаком разработчику, работающему с Javascript, и - будучи строковой структурой объекта - это более естественный метод сериализации для взаимодействия в браузере, чем полноценный производный XML (со всеми вытекающими проектными решениями).

Легко и интуитивно понятно.

0 голосов
/ 29 апреля 2009

Дело не в том, что это лучше, а в том, что он может связать много вещей, чтобы обеспечить беспрепятственную передачу данных без анализа вручную!

Например, javascript -> веб-служба C # -> javascript

...