Что такое JSON и зачем мне его использовать?

542

Я просмотрел википедию, прогуглил ее и прочитал официальную документацию, но до сих пор не дошел до того, что действительно понимаю, что такое JSON и почему я его использую.

Некоторое время я создавал приложения с использованием PHP, MySQL и Javascript / HTML, и если JSON сможет что-то сделать, чтобы моя жизнь стала проще, или мой код стал лучше, или мой пользовательский интерфейс лучше, я бы хотел узнать об этом. Может ли кто-нибудь дать мне краткое объяснение?

Бен
источник
2
JSON является подмножеством YAML yaml.org
Брэд Гилберт
15
copterlabs.com/blog/json-what-it-is-how-it-works-how-to-use-it это хороший простой пример использования
Том
1
Также читайте об I-JSON: tbray.org/ongoing/When/201x/2015/03/23/i-json
Кристоф Русси
1
+ Брэд Гилберт Не совсем - это собственный способ выражения данных, и он похож на JSON только потому, что они оба выражают объекты в виде строк (аналогично XML, спискам или многим другим), но JSON лучше подходит для машинной записи, а YAML - для написания человеком. ,
Бен Обин

Ответы:

649

JSON (JavaScript Object Notation) - это легкий формат, который используется для обмена данными. Он основан на подмножестве языка JavaScript (способ создания объектов в JavaScript). Как указано в MDN , некоторые JavaScript не являются JSON, а некоторые JSON не являются JavaScript.

Примером того, где это используется, являются ответы веб-сервисов. В «старые» времена веб-службы использовали XML в качестве основного формата данных для передачи обратных данных, но с тех пор, как появился JSON ( формат JSON указан в RFC 4627 Дугласом Крокфордом ), он был предпочтительным форматом, поскольку он гораздо более легкий

Вы можете найти гораздо больше информации на официальном сайте JSON .

JSON построен на двух структурах:

  • Коллекция пар имя / значение. На разных языках это реализовано как объект, запись, структура, словарь, хеш-таблица, список ключей или ассоциативный массив.
  • Упорядоченный список значений. В большинстве языков это реализовано как массив, вектор, список или последовательность.

Структура JSON



Диаграмма объектов JSON

Диаграмма массива JSON

Диаграмма значений JSON

JSON Строковая диаграмма

Цифровая диаграмма JSON

Вот пример данных JSON:

{
     "firstName": "John",
     "lastName": "Smith",
     "address": {
         "streetAddress": "21 2nd Street",
         "city": "New York",
         "state": "NY",
         "postalCode": 10021
     },
     "phoneNumbers": [
         "212 555-1234",
         "646 555-4567"
     ]
 }

JSON в JavaScript

JSON (в Javascript) это строка!

Люди часто предполагают, что все объекты Javascript - это JSON, а JSON - это объект Javascript. Это неверно

В Javascript var x = {x:y}это не JSON , это объект Javascript . Два не одно и то же. Эквивалент JSON (представленный на языке Javascript) будет var x = '{"x":"y"}'. xэто объект типа string, а не объект сам по себе. Чтобы превратить это в полноценный объект Javascript, вы должны сначала разобрать его var x = JSON.parse('{"x":"y"}');,x теперь объект , но это не JSON больше.

Смотрите Javascript объект против JSON


При работе с JSON и JavaScript может возникнуть соблазн использовать evalфункцию для оценки результата, возвращаемого в обратном вызове, но это не рекомендуется, поскольку в JSON допустимы два символа (U + 2028 и U + 2029), но не в JavaScript (подробнее об этом здесь ).

Поэтому всегда нужно пытаться использовать скрипт Крокфорда, который проверяет допустимый JSON, прежде чем оценивать его. Ссылка на объяснение сценария находится здесь, а здесь - прямая ссылка на файл js. В настоящее время каждый крупный браузер имеет собственную реализацию для этого.

Пример использования синтаксического анализатора JSON (с json из приведенного выше фрагмента кода):

//The callback function that will be executed once data is received from the server
var callback = function (result) {
    var johnny = JSON.parse(result);
    //Now, the variable 'johnny' is an object that contains all of the properties 
    //from the above code snippet (the json example)
    alert(johnny.firstName + ' ' + johnny.lastName); //Will alert 'John Smith'
};

Парсер JSON также предлагает еще один очень полезный метод stringify. Этот метод принимает объект JavaScript в качестве параметра и возвращает строку в формате JSON. Это полезно, когда вы хотите отправить данные обратно на сервер:

var anObject = {name: "Andreas", surname : "Grech", age : 20};
var jsonFormat = JSON.stringify(anObject);
//The above method will output this: {"name":"Andreas","surname":"Grech","age":20}

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

Кстати, для всех вас, кто думает, что JSON только для JavaScript, прочитайте этот пост, который объясняет и подтверждает иное.


Ссылки

Andreas Grech
источник
1
Независимо от способа сериализации информации, у вас будет парсер, верно? Поэтому, кого волнует, какой формат вы используете для передачи данных, если детали его реализации будут абстрагированы.
Том Леман
6
На самом деле, если вы передаете данные туда и обратно на клиент и сервер, я думаю, что очень важно быть осторожным с размерами ваших ответов.
Андреас Греч
9
Для педантиков есть пара символов, которые JSON обрабатывает не так, как JavaScript, что не позволяет ему быть строгим подмножеством: timelessrepo.com/json-isnt-a-javascript-subset
Джереми Бэнкс,
Когда вы говорите, что он более легкий, чем XML, вы имеете в виду размер файла или легкий код имеет пространственное значение в кодировании?
whatahitson
1
Так вы бы заменить XML на JSON? Это то, что вы говорите? Если так ... Отлично, xml - это кошмар.
James111
66

Объясненная концепция - без кода или технического жаргона

Что такое JSON? - Как я это объяснил своей жене ТМ

Я: «Это в основном способ общения с кем-то в письменной форме ... но с очень конкретными правилами.

Жена: да ....?

Я: В прозаическом английском правила довольно простые: как в случае с клеткой. Не так с JSON. Есть много способов описать что-то:

• Пример 1. В нашей семье 4 человека: ты, я и 2 ребенка.

• Пример 2. Наша семья: ты, я, малыш1 и малыш2.

• Пример 3: Семья: [ты, я, малыш1, малыш2]

• Пример 4: у нас в семье 4 человека: мама, папа, малыш1 и малыш2.

Жена: Почему они просто не используют простой английский вместо этого?

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

{
                "Family" :  ["Me", "Wife", "Kid1", "Kid2"] 
}

…… и это в основном JSON. Но помните, вы ДОЛЖНЫ соблюдать правила грамматики JSON. Если вы нарушите эти правила, то компьютер просто не поймет (то есть проанализирует) то, что вы пишете.

Жена: Так как мне написать в Json?

Хорошим способом было бы использовать json сериализатор - это библиотека, которая делает тяжелую работу за вас.

Резюме

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

BKSpurgeon
источник
48

Короче говоря, JSON - это способ сериализации таким образом, что он становится кодом JavaScript. При выполнении (с помощью eval или иным образом) этот код создает и возвращает объект JavaScript, который содержит сериализованные вами данные. Это доступно, потому что JavaScript допускает следующий синтаксис:

var MyArray = [ 1, 2, 3, 4]; // MyArray is now an array with 4 elements
var MyObject = {
    'StringProperty' : 'Value',
    'IntProperty' : 12,
    'ArrayProperty' : [ 1, 2, 3],
    'ObjectProperty' : { 'SubObjectProperty': 'SomeValue' }
}; // MyObject is now an object with property values set.

Вы можете использовать это для нескольких целей. С одной стороны, это удобный способ передачи данных из серверной части в код JavaScript. Таким образом, это часто используется в AJAX.

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

Vilx-
источник
31

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

Синтаксис используется в JavaScript, а сам JSON означает «нотация объектов JavaScript». Однако он стал переносимым и используется на других языках.

Полезная ссылка для деталей здесь:

http://secretgeek.net/json_3mins.asp

MSON
источник
19

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

Пинакин Найи
источник
16

JSON - это нотация объектов JavaScript. Это гораздо более компактный способ передачи наборов данных через сетевые соединения по сравнению с XML. Я предлагаю использовать JSON в любых AJAX-подобных приложениях, где XML в противном случае был бы «рекомендуемым» вариантом. Детальность XML добавит времени загрузки и увеличит потребление полосы пропускания ($$$). Вы можете добиться того же эффекта с помощью JSON, и его разметка почти исключительно предназначена для самих данных, а не для базовой структуры.

Nolte
источник
11

общий короткий ответ: если вы используете AJAX для выполнения запросов данных, вы можете легко отправлять и возвращать объекты в виде строк JSON. Доступные расширения Javascript поддерживают вызовы toJSON () для всех типов javascript для отправки данных на сервер в запросе AJAX. Ответы AJAX могут возвращать объекты в виде строк JSON, которые можно преобразовать в объекты Javascript простым вызовом eval, например, если функция AJAX вернула someAjaxFunctionCallReturningJson

"{ \"FirstName\" : \"Fred\", \"LastName\" : \"Flintstone\" }"

Вы могли бы написать в Javascript

var obj = eval("(" + someAjaxFunctionCallReturningJson().value + ")");
alert(obj.FirstName);
alert(obj.LastName);

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

  • Обновление (десять лет спустя): не делайте этого, используйте JSON.parse
Стивен А. Лоу
источник
1
С eval () все будет оценено. это риск для безопасности.
Томас Веллер
@ThomasWeller да, этот ответ древний, я пойду с JSON.parse теперь спасибо!
Стивен А. Лоу
8

Мне нравится JSON в основном потому, что это так кратко . Для веб-контента, который можно распаковать, это не обязательно имеет большое значение (следовательно, почему x html так популярен). Но бывают случаи, когда это может быть полезным.

Например, для одного проекта я передавал информацию, которую нужно было сериализовать и передавать через XMPP . Поскольку большинство серверов ограничивают объем данных, которые вы можете передавать в одном сообщении, я нашел полезным использовать JSON вместо очевидной альтернативы, XML.

В качестве дополнительного бонуса, если вы знакомы с Python или Javascript, вы уже в значительной степени знаете JSON и можете интерпретировать его без особой подготовки.

Джейсон Бейкер
источник
8

Что такое JSON?

JavaScript Object Notation (JSON) - это легкий формат обмена данными, основанный на объектных литералах JavaScript.

Значения JSON могут состоять из:

объекты (коллекции пар имя-значение) массивы (упорядоченные списки значений) строки (в двойных кавычках) числа true, false или null

JSON не зависит от языка.

JSON с PHP?

После версии PHP 5.2.0 расширение JSON декодирует и кодирует функциональные возможности по умолчанию.

Json_encode - возвращает JSON-представление значений. Json_decode - декодирует JSON-строку. Json_last_error - возвращает последнюю возникшую ошибку.

Синтаксис и правила JSON?

Синтаксис JSON получен из синтаксиса нотации объектов JavaScript:

Данные в парах имя / значение. Данные разделяются запятыми. В фигурных скобках хранятся объекты. В квадратных скобках хранятся массивы.

Elangovan
источник
4

Нам нужно сделать проект в колледже, и мы столкнулись с очень большой проблемой, которая называется Same Origin Policy. Помимо прочего, он делает так, что ваш метод XMLHttpRequest из Javascript не может делать запросы к доменам, отличным от домена, на котором находится ваш сайт.

Например, вы не можете сделать запрос на www.otherexample.com, если ваш сайт находится на www.example.com. JSONRequest позволяет это, но вы получите результат в формате JSON, если этот сайт позволяет это (например, у него есть веб-служба, которая возвращает сообщения в формате JSON). Это одна из проблем, когда вы могли бы использовать JSON, возможно.

Вот что-то практичное: Yahoo JSON

gljivar
источник
4

Разница между JSON и обычным синтаксисом будет следующая (в Javascript)

общепринятый

 function Employee(name, Id, Phone, email){

      this.name = name;
      this.Id = Id;
      this.Phone = Phone;
      this.email = email;
  }

  //access or call it as 

var Emp = new Employee("mike","123","9373849784","mike.Anderson@office.com");

С JSON

если мы используем JSON, мы можем определить по-другому, как

  function Employee(args){

   this.name = args.name;
   this.Id = args.Id;
   this.Phone = args.Phone;
   this.email = args.email;
}

//now access this as...

var Emp = new Employee({'name':'Mike', 'Id':'123', 'Phone':'23792747', 'email':'mike.adnersone@office.com'});

Важно помнить, что, если нам нужно построить класс «Employee» или модал из 100 элементов без метода JSON, мы должны проанализировать все при создании класса. Но с помощью JSON мы можем определить встроенные объекты только тогда, когда определен новый объект для класса.

так что эта строка ниже - способ работы с JSON (простой способ определения вещей)

 var Emp = new Employee({'name':'Mike', 'Id':'123', 'Phone':'23792747', 'email':'mike.adnersone@office.com'});
Ганеш Велланки
источник
2
Это не совсем JSON - это объект Javascript (не JSON)
Бен Обин,
4

Иногда техническая информация дается там, где это не требуется, и хотя многие из наиболее часто задаваемых ответов являются точными техническими и конкретными, я лично не думаю, что они более легки для понимания или кратки, чем то, что можно найти в Википедии или в официальная документация.

То, что мне нравится думать о JSON, это именно то, чем он является - язык в мире разных языков. Тем не менее, разница между JSON и другими языками заключается в том, что «все» говорят на «JSON вместе со своим« родным языком ».

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

Что мы можем сделать?

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

В мире программирования первый «человек» - это Python, второй «человек» - это Ruby, а третий «человек» - это JSON, который, как оказалось, может «перевести» Ruby на Python и наоборот! Очевидно, что эта аналогия не идеальна, но как человек, говорящий на двух языках, я считаю, что это простой способ взглянуть на то, как JSON взаимодействует с другими языками программирования.

джерел
источник
2

Это очень просто JSON обозначает Java Script Object Notation. Думайте об этом как об альтернативе использованию XML для передачи данных между программными компонентами.

Например, я недавно написал несколько веб-сервисов, которые возвращали JSON, и некоторые разработчики Javascript затем написали код, который вызывал сервисы и использовал информацию, возвращенную в этом формате.

Джон
источник
2

JSON (нотация объектов Javascript) - это легкий формат данных для обмена / передачи данных. Его в паре ключ-значение, как в JavaScript. Для REST API его широко используют для передачи данных с сервера на клиент. В настоящее время многие из социальных сетей используют это. Хотя я не считаю это таким же надежным, как XML, в отношении типов данных. XML имеет очень богатые типы данных и XSD. JSON немного не хватает в этом.

При таком же количестве строковых данных JSON будет легче сравнивать с XML, так как XML имеет все открывающие и закрывающие теги и т. Д.

Шайлендра Сингх
источник
0

В контексте Java, одной из причин, по которой JSON может захотеть использоваться, является то, что он предоставляет очень хорошую альтернативу инфраструктуре сериализации Java, которая (исторически) была подвержена некоторым довольно серьезным уязвимостям.

Джошуа Блох подробно обсуждает это в пункте 85 «Предпочитают альтернативы сериализации Java» (Effective Java 3rd Edition)

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

johnm
источник
-3

Попробуйте следующий код для анализа вашего ответа php json: read.php

<script
  src="https://code.jquery.com/jquery-3.2.1.min.js"
  integrity="sha256-hwg4gsxgFZhOsEEamdOYGBf13FyQuiTwlAQgxVSNgt4="
  crossorigin="anonymous"></script>
<script type="text/javascript">  
$.ajax({
    url:'index.php',
    data:{},
    type:"POST",
    success:function(result) {
        jsondecoded = $.parseJSON(result);
        $.each(jsondecoded, function(index, value) {
            $("#servers").text($("#servers").text() + " " + value.servername);
            console.log(value.start);
            console.log(value.end);
            console.log(value.id);
        });
    },
    statusCode: {
    404: function() {
      alert( "page not found" );
    }
  }
});
</script>

server.php

<?php 
echo '[{"start":"2017-08-29","end":"2017-09-01","id":"22"},{"start":"2017-09-03","end":"2017-09-06","id":"23"}]';
?>
Amit Rawat
источник
Хотя этот код может ответить на вопрос, предоставление дополнительного контекста относительно того, как и / или почему он решает проблему, улучшит долгосрочную ценность ответа.
Nic3500