Подтвердить что ты не робот

Объект Javascript Vs JSON

Я хочу понять основные различия между объектами Javascript и строкой JSON.

Скажем, я создаю следующую переменную JS:

var testObject = {one: 1,"two":2,"three":3};

Q1. Является ли имя ключа/свойства действительным как с/без кавычек? (например, "one" : 1)

Если да, в чем разница?

Q2: Если я преобразую вышеуказанный объект с помощью JSON.stringify(testObject), в чем разница между исходным JS-объектом и JSON?

Я чувствую, что они почти одинаковы. Пожалуйста, уточните это.

Q3: для синтаксического анализа строки JSON рекомендуется использовать метод ниже?

var javascriptObj = JSON.parse(jSonString);
4b9b3361

Ответ 1

  • Является ли имя ключа/свойства действительным как с/без кавычек?

    Единственный раз, когда вам нужно заключить ключ в кавычки при использовании нотации Object Literal, где ключ содержит специальный символ (if, :, - и т.д.). Стоит отметить, что ключ в JSON должен заключен в double кавычки.

  • Если я конвертирую вышеуказанный объект в JSON с помощью var jSonString = JSON.stringify(testObject);, в чем разница между двумя (JS obj и JSON)?

    JSON - это формат обмена данными. Это стандарт, который описывает, как упорядоченные списки и неупорядоченные карты, строки booleans и numbers могут быть представлены в строке. Подобно тому, как XML и YAML - это способ передачи структурированной информации между языками, JSON - то же самое. Объект JavaScript, с другой стороны, является физическим. Подобно массиву PHP, классу/структуре С++, объект JavaScript является внутренним для JavaScript.

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

    В магазине сундуки, которые вы купили, являются живым объектом:

    var chestOfDrawers = {
        color: "red",
        numberOfDrawers: 4
    }
    

    Однако вы не можете отправить комод в столбе, так что вы его демонтируете (читайте, строчите его). Теперь это бесполезно с точки зрения мебели. Сейчас JSON. Его в виде плоской упаковки.

    {"color":"red","numberOfDrawers":4}
    

    Когда вы его получите, вы затем перестраиваете сундук (читайте, разбирайте его). Теперь он возвращается в виде объекта.

    Причина JSON/XML и YAML заключается в том, чтобы передавать данные между языками программирования в формате, который могут понять языки-участники; вы не можете напрямую передавать PHP или С++ свой объект JavaScript; потому что каждый язык представляет собой объект по-разному под капотом. Однако, поскольку мы привязали объект к нотации JSON; т.е. стандартизированный способ представления данных, мы можем передать JSON-представление объекта другому langauge (С++, PHP), они могут воссоздать объект JavaScript, который у нас был, в свой собственный объект на основе представления объекта JSON.

    Важно отметить, что JSON не может представлять функции или даты. Если вы попытаетесь связать объект с членом функции, функция будет опущена из представления JSON. Дата будет преобразована в строку;

    JSON.stringify({
        foo: new Date(),
        blah: function () { 
            alert('hello');
        }
    }); // returns the string "{"foo":"2011-11-28T10:21:33.939Z"}"
    
  • Для разбора строки JSON рекомендуется ли метод ниже? var javascriptObj = JSON.parse(jSonString);

    Да, но старые браузеры не поддерживают JSON изначально (IE < 8). Чтобы поддержать их, вы должны включить json2.js.

    Если вы используете jQuery, вы можете вызвать jQuery.parseJSON(), который будет использовать JSON.parse() под капотом, если он будет поддерживаться и будет в противном случае отпадает необходимость в пользовательской реализации для синтаксического анализа ввода.

Ответ 2

Q1: При определении литералов объектов в javascript ключи могут включать в себя кавычки или нет. Нет никакой разницы, кроме того, что кавычки позволяют указывать определенные ключи, которые заставляют интерпретатор не разбираться, если вы попробовали их голыми. Например, если вы хотите, чтобы ключ был просто восклицательным знаком, вам понадобятся кавычки:

a = { "!": 1234 } // Valid
a = { !: 1234 } //  Syntax error

В большинстве случаев, вы можете опустить кавычки вокруг ключей в объектных литералах.

Q2: JSON буквально представляет собой строковое представление. Это просто строка. Итак, рассмотрите следующее:

var testObject = { hello: "world" }
var jSonString = JSON.stringify(testObject);

Так как testObject является реальным объектом, вы можете вызывать его свойства и делать что-то еще, что вы можете делать с объектами:

testObject.hello => "world"

С другой стороны, jsonString - это просто строка:

jsonString.hello => undefined

Обратите внимание на одно другое отличие: в JSON все ключи должны быть указаны. Это контрастирует с объектными литералами, где цитаты обычно могут быть опущены в соответствии с моим объяснением в Q1.

Q3. Вы можете проанализировать строку JSON с помощью JSON.parse, и это, как правило, лучший способ сделать это (если это обеспечивает браузер или инфраструктура). Вы также можете просто использовать eval, так как JSON - это действительный код javascript, но первый метод рекомендуется по ряду причин (у eval есть много неприятных проблем, связанных с ним).

Ответ 3

Q1 - в JS вам нужно использовать только кавычки, если ключ является зарезервированным словом или если это иначе было бы незаконным токеном. В JSON вы ДОЛЖНЫ всегда использовать двойные кавычки на имена ключей.

Q2 - jsonString - сериализованная версия входного объекта...

Q3 - который можно десериализовать на идентично выглядящий объект, используя JSON.parse()

Ответ 4

Проблемы, решаемые JSON

Предположим, вы хотите обменять обычные объекты JavaScript между двумя компьютерами, и вы установили два правила:

  • Переданные данные должны быть регулярной строкой.
  • Можно обменивать только атрибуты, методы не передаются.

Теперь вы создаете два объекта на первом хосте:

var obj1 = { one: 1,"two":2,"three":3 }; // your example
var obj2 = { one: obj1.one, two: 2, three: obj1.one + obj1.two };

Как вы можете преобразовать эти объекты в строки для передачи на второй хост?

  • Для первого объекта вы можете отправить эту строку, полученную из определения литерала '{ one: 1,"two":2,"three":3 }', но на самом деле вы не можете прочитать литерал в script части документа (по крайней мере, не так просто). Поэтому obj1 и obj2 должны обрабатываться одинаково.
  • Вам нужно перечислить все атрибуты и их значение и построить строку, аналогичную литералу объекта.

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

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

Помните, что JSON - это только набор правил (стандарт).

Сколько объектов JSON создано?

Только один, он автоматически создается движком JS.

Современные механизмы JavaScript, найденные в браузерах, имеют собственный объект, также называемый JSON. Этот объект JSON способен:

  • Декодировать строку, построенную с использованием стандарта JSON, используя JSON.parse(string). Результатом является обычный объект JS с атрибутами и значениями, найденными в строке JSON.

  • Кодировать атрибуты/значения обычного объекта JS с помощью JSON.stringify(). Результатом является строка, соответствующая набору правил JSON.

(одиночный) объект JSON похож на кодек, его функция предназначена для кодирования и декодирования.

Обратите внимание, что:

  • JSON.parse() не создает объект JSON, он создает обычный объект JS, нет никакой разницы между объектом, созданным с использованием литерала объекта, и объектом, созданным JSON.parse(), из JSON-совместимая строка.

  • Существует только один объект JSON, который используется для всех преобразований.

Возвращаясь к вопросам:

  • Q1: использование одиночных двойных кавычек допускается для объектных литералов. Обратите внимание, что кавычки используются необязательно для имен атрибутов и являются обязательными для строковых значений. Сам объект-литерал не окружен кавычками.

  • Q2: Объекты, созданные из литералов и использующие JSON.parse(), строго одинаковы. Эти два объекта эквивалентны после создания:

    var obj1 = { one: 1, "two": 2, "three": 3 };
    var obj2 = JSON.parse('{ "one": "1", "two": "2", "three": "3" }');

  • Q3: В современных браузерах JSON.parse() используется для создания объекта JS из строки, совместимой с JSON. (jQuery также имеет эквивалентный метод, который может использоваться для всех браузеров).

Ответ 5

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

// Valid JSON strings(Observe quotes)
valid_json = '{"key":"value"}'
valid_json_2 = '{"key 1":"value 1"}' // Observe the space(special character) in key - still valid


//Valid Javascript object
valid_javascript_object_no_quotes = {
    key: "value"  //No special character in key, hence it is valid without quotes for key
}


//Valid Javascript object
valid_javascript_object_quotes = {
    key:"value",  //No special character in key, hence it is valid without quotes for key
    "key 1": "value 1" // Space (special character) present in key, therefore key must be contained in double quotes  - Valid
}



console.log(typeof valid_json) // string
console.log(typeof valid_javascript_object_no_quotes) // object
console.log(typeof valid_javascript_object_quotes) // object

//Invalid Javascript object 
invalid_javascript_object_no_quotes = {
   key 1: "value"//Space (special character) present in key, since key is not enclosed with double quotes "Invalid Javascript Object"
}