В чем разница между JSON и Object Literal Notation? - PullRequest
204 голосов
/ 25 мая 2010

Может кто-нибудь сказать мне, в чем заключается основное различие между объектом JavaScript, определенным с помощью Буквальная запись объекта и JSON-объект ?

Согласно книге на JavaScript, говорится, что это объект, определенный с помощью Обозначение объекта :

var anObject = {
    property1 : true,
    showMessage : function (msg) { alert(msg) }
};

Почему в данном случае это не объект JSON? Только потому, что это не определяется с помощью кавычек?

Ответы [ 10 ]

236 голосов
/ 25 мая 2010

Давайте сначала уточнить, что на самом деле JSON . JSON - это текстовый , независимый от языка формат обмена данными, очень похожий на XML, CSV или YAML.

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

Такие форматы обычно не зависят от языка, то есть они могут обрабатываться Java, Python, JavaScript, PHP, назовите его.

Напротив, JavaScript является языком программирования. Конечно, JavaScript также предоставляет способ определения / описания данных, но синтаксис очень специфичен для JavaScript.

В качестве встречного примера, Python имеет концепцию кортежей , их синтаксис (x, y). JavaScript не имеет ничего подобного.


Давайте рассмотрим синтаксические различия между литералами объектов JSON и JavaScript.

JSON имеет следующие синтаксические ограничения:

  • Объект ключи должны быть строк (т.е. последовательность символов, заключенная в двойные кавычки ").
  • Значения могут быть следующими:
    • строка
    • число
    • объект (JSON)
    • массив
    • true
    • false
    • null
  • Дубликаты ключей ({"foo":"bar","foo":"baz"}) дают неопределенные, зависящие от реализации результаты; спецификация JSON специально не определяет их семантику

В JavaScript объектные литералы могут иметь

  • Строковые литералы, числовые литералы или имена идентификаторов в качестве ключей (начиная с ES6, ключи теперь также можно вычислять, что вводит еще один синтаксис).
  • Значениями могут быть любые допустимые выражения JavaScript, включая определения функций и undefined.
  • Дублирующие ключи дают определенные, определенные результаты (в свободном режиме последнее определение заменяет первое; в строгом режиме это ошибка).

Зная это, просто посмотрите на синтаксис , ваш пример не JSON по двум причинам:

  1. Ваши ключи не являются строками (литералами). Это идентификаторов .
  2. Нельзя назначить функцию в качестве значения для «объекта JSON» (поскольку JSON не определяет синтаксис для функций).

Но самое главное, повторить мое объяснение с самого начала: вы находитесь в контексте JavaScript. Вы определяете объект JavaScript. Если таковой имеется, «объект JSON» может содержаться только в строке:

 var obj = {foo: 42}; // creates a JavaScript object (this is *not* JSON)
 var json = '{"foo": 452}'; // creates a string containing JSON

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


Только из-за того, что литералы объектов и JSON выглядят похожими , это не означает, что вы можете называть их взаимозаменяемо. См. Также Нет такой вещи как "JSON Object" .

40 голосов
/ 25 мая 2010

JSON имеет гораздо более ограниченный синтаксис, включая:

  • Ключевые значения должны быть указаны
  • Строки должны быть заключены в кавычки ", а не '
  • У вас есть более ограниченный диапазон значений (например, функции не разрешены)
14 голосов
/ 14 декабря 2011

На самом деле не существует такого понятия, как "объект JSON".

Спецификация JSON - это синтаксис для кодирования данных в виде строки. То, что люди называют «JSON-объект» (в javascript), на самом деле является просто обычным javascript-объектом, который (вероятно) был десериализован из допустимой строки JSON и может быть легко повторно сериализован как допустимая строка JSON. Обычно это означает, что он содержит только данные (а не функции). Это также означает, что даты отсутствуют, потому что в JSON нет типа даты (вероятно, самая болезненная вещь в JSON;)

Более того, (побочное выражение ...), когда люди говорят о «объекте JSON», они почти всегда имеют в виду данные с «фигурными скобками» на верхнем уровне. Это хорошо соответствует объекту javascript. Однако спецификация JSON не требует наличия единственного объекта "фигурных скобок" на верхнем уровне строки JSON. Для JSON вполне допустимо иметь список на верхнем уровне или даже иметь только одно значение. Таким образом, хотя каждый «объект JSON» соответствует действительному JSON, не все допустимые строки JSON соответствуют тому, что мы назвали бы «объектом JSON»! (поскольку строка может представлять список или атомарное значение)

9 голосов
/ 16 февраля 2011

Согласно JSON в JavaScript ,

JSON - это подмножество объекта буквенное обозначение JavaScript.

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

В дополнение к чтению документации , как предложил @Filix King, я также предлагаю поиграть с онлайн-валидатором JSONLint JSON . Вот как я узнал, что ключи объектов JSON должны быть строками.

3 голосов
/ 09 августа 2017

? JSON : безжировая альтернатива XML

JSON получил широкое распространение среди людей, которые обнаружили, что это значительно облегчает создание распределенных приложений и сервисов. Официальный тип интернет-медиа для JSON: application/json RFC 4627. В именах файлов JSON используется расширение .json.


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

Объект JSON - это отдельный объект, который содержит две функции, parse и stringify, которые используются для анализа и построения текстов JSON.

  • JSON.stringify создает строку, соответствующую следующей грамматике JSON.
  • JSON.parse принимает строку, соответствующую грамматике JSON.

Метод parseJSON будет включен в Fourth Edition of ECMAScript. Тем временем на json.org доступна реализация JavaScript.

var objLiteral = {foo: 42}; // JavaScript Object
console.log('Object Literal : ', objLiteral ); // Object {foo: 42}foo: 42__proto__: Object

// This is a JSON String, like what you'd get back from an AJAX request.
var jsonString = '{"foo": 452}';
console.log('JOSN String : ', jsonString ); // {"foo": 452}

// This is how you deserialize that JSON String into an Object.
var serverResposnceObject = JSON.parse( jsonString );
console.log('Converting Ajax response to JavaScript Object : ', serverResposnceObject); // Object {foo: 42}foo: 42 __proto__: Object

// And this is how you serialize an Object into a JSON String.
var serverRequestJSON = JSON.stringify( objLiteral );
console.log('Reqesting server with JSON Data : ', serverRequestJSON); // '{"foo": 452}'

JSON является подмножеством JavaScript. Javascript был получен из стандарта языка программирования ECMAScript.


► ECMAScript

ECMAScript стал одним из самых широко используемых в мире языков программирования общего назначения. Он наиболее известен как язык, встроенный в веб-браузеры, но также широко применяется для серверных и встроенных приложений. ECMAScript основан на нескольких исходных технологиях, наиболее известной из которых является JavaScript ( Netscape Communications)) и JScript (корпорация Microsoft).) . Хотя до 1994 года ECMA была известна как «Европейская ассоциация производителей компьютеров», после 1994 года, когда организация стала глобальной, «торговая марка» «Ecma» сохранилась по историческим причинам.

ECMAScript - это язык, тогда как JavaScript, JScript и даже ActionScript называются "Dialects".

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

  • Язык SQL - Hibernate MySQL Dialect, Oracle Dialect, ... с некоторыми изменениями или добавленной функциональностью.

Информация о браузере и компьютере ваших пользователей.

navigator.appName // "Netscape"

ECMAScript - это язык сценариев, который лежит в основе JavaScript. JavaScript language resources.

ECMA-262 Links
Initial Edition, June 1997 <a href="http://www.ecma-international.org/publications/files/ECMA-ST-ARCH/ECMA-262,%201st%20edition,%20June%201997.pdf" rel="nofollow noreferrer">PDF</a>.
2nd Edition, August 1998 <a href="https://www.ecma-international.org/publications/files/ECMA-ST-ARCH/ECMA-262,%202nd%20edition,%20August%201998.pdf" rel="nofollow noreferrer">PDF</a>.
3rd Edition, December 1999 <a href="https://www.ecma-international.org/publications/files/ECMA-ST-ARCH/ECMA-262,%203rd%20edition,%20December%201999.pdf" rel="nofollow noreferrer">PDF</a>.
5th Edition, December 2009 <a href="http://www.ecma-international.org/publications/files/ECMA-ST-ARCH/ECMA-262%205th%20edition%20December%202009.pdf" rel="nofollow noreferrer">PDF</a>.
5.1 Edition, June 2011 <a href="https://www.ecma-international.org/ecma-262/5.1/#sec-15.12.1" rel="nofollow noreferrer">HTML</a>.
6th Edition, June 2015 <a href="http://www.ecma-international.org/ecma-262/6.0/index.html#sec-json-object" rel="nofollow noreferrer">HTML</a>.
7ᵗʰ Edition, June 2016 <a href="http://www.ecma-international.org/ecma-262/7.0/index.html#sec-json-object" rel="nofollow noreferrer">HTML</a>.
8th edition, June 2017 <a href="http://www.ecma-international.org/ecma-262/8.0/index.html#sec-json-object" rel="nofollow noreferrer">HTML</a>.
9th Edition, 2018 <a href="https://tc39.github.io/ecma262/" rel="nofollow noreferrer">HTML</a>.

ПРИМЕЧАНИЕ « 4-е издание из ECMAScript не опубликовано, поскольку работа была неполной .


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

  1. ► Значения ключей должны быть в кавычках, для ключей допускаются только строки. Если вы используете не String, он будет преобразован в String. Но не рекомендуется использовать ключи, отличные от String. Посмотрите на пример, подобный этому - { 'key':'val' } over RFC 4627 - jsonformatter

    var storage = {
      0 : null,
      1 : "Hello"
    };
    console.log( storage[1] ); // Hello
    console.log( JSON.stringify( storage ) ); // {"0":null,"1":"Hello","2":"world!"}
    
    var objLiteral = {'key1':'val1'};
        var arr = [10, 20], arr2 = [ 'Yash', 'Sam' ];
        var obj = { k: 'v' }, obj2 = { k2: 'v2' };
        var fun = function keyFun() {} ;
    
    objLiteral[ arr ] = 'ArrayVal';     objLiteral[ arr2 ] = 'OverridenArrayVal';
    objLiteral[ obj ] = 'ObjectVal';    objLiteral[ obj2 ] = 'OverridenObjectVal';
    objLiteral[ fun ] = 'FunctionVal';
    
    console.log( objLiteral );
    // Object {key1: "val1", 10,20: "ArrayVal", Yash,Sam: "OverridenArrayVal", [object Object]: "OverridenObjectVal", function keyFun() {}: "FunctionVal"}
    console.log( JSON.stringify( objLiteral ) );
    // {"key1":"val1","10,20":"ArrayVal","Yash,Sam":"OverridenArrayVal","[object Object]":"OverridenObjectVal","function keyFun() {}":"FunctionVal"}
    console.log( JSON.parse( JSON.stringify( objLiteral ) ) );
    // Object {key1: "val1", 10,20: "ArrayVal", Yash,Sam: "OverridenArrayVal", [object Object]: "OverridenObjectVal", function keyFun() {}: "FunctionVal"}
    
    console.log('Accessing Array  Val : ', objLiteral[ [10,20] ] );
    console.log('Accessing Object Val : ', objLiteral[ '[object Object]' ] );
    console.log('Accessing Function Val : ', objLiteral[ 'function keyFun() {}' ] );
    
  2. ► Строки JSON должны заключаться в кавычки "а не". Строка очень похожа на строку C или Java. Строки должны быть заключены в двойные кавычки.

    • Literal - это фиксированные значения, а не переменные, которые вы буквально предоставляете в своем скрипте.
    • Строка - это последовательность из нуля или более символов, заключенная в кавычки с обратной косой чертой, то же самое обозначение используется в большинстве языков программирования.
      • ? - Специальные символы разрешены в строке, но не рекомендуется использовать.
      • \ "- Специальные символы могут быть экранированы. Но не рекомендуется избегать (') одинарных кавычек. В строгом режиме скинет и ошибка - SyntaxError: Unexpected token ' in JSON

    Проверьте с этим кодом { "Hai\" \n Team ?":5, "Bye \'": 7 } через онлайн JSON Edtions. ModesnotStrict,Strinct.

    var jsonString = "{'foo': 452}"; // {'foo': 452}
    var jsonStr = '{"foo": 452}'; // {"foo": 452}
    
    JSON.parse( jsonString ); // Unexpected token ' in JSON at position 1(…)
    JSON.parse( jsonStr ); // Object {foo: 452}
    
    objLiteral['key'] = 'val'; // Object {foo: 42, key: "val"}
    objLiteral.key2 = 'val';
    
    // objLiteral.key\n3 - SyntaxError: Invalid or unexpected token
    objLiteral['key\n3'] = 'val'; // Object {"foo": "42", key: "val", key2: "val", "key↵3": "val"}
    
    JSON.stringify( objLiteral ); // {"foo":"42","key":"val","key2":"val","key\n3":"val"}
    

Объект Средства доступа к свойствам обеспечивают доступ к свойствам объекта с помощью точечной нотации или скобочной нотации.

  1. ► У вас есть более ограниченный диапазон значений (например, функции не разрешены). Значение может быть строкой в ​​двойных кавычках, числом, логическим значением, нулем, объектом или массивом. Эти структуры могут быть вложенными.

    var objLiteral = {};
    objLiteral.funKey = function sayHello() {
        console.log('Object Key with function as value - Its outcome message.');
    };
    
    objLiteral['Key'] = 'Val';
    
    console.log('Object Literal Fun : ', objLiteral );
    // Object Literal Fun :  Object {Key: "Val"}Key: "Val"funKey: sayHello()__proto__: Object
    console.log( JSON.stringify( objLiteral ) ); // {"Key":"Val"}
    

enter image description here


JavaScript является самой популярной реализацией стандарта ECMAScript. Основные функции Javascript основаны на стандарте ECMAScript, но Javascript также имеет другие дополнительные функции, которых нет в спецификации / стандарте ECMA. В каждом браузере есть интерпретатор JavaScript.

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

Literals:

'37' - 7    // 30
'37' + 7    // "377"
+'37' + 7   // 44
+'37'       // 37
'37'        // "37"

parseInt('37');     // 37
parseInt('3.7');    // 3

parseFloat(3.7);    // 3.7

// An alternative method of retrieving a number from a string is with the + (unary plus) operator:
+'3.7'              // 3.7

Object literals RFC 7159

Структура объекта представляется в виде пары фигурных скобок, окружающих ноль или более пар имя / значение (или членов). Имя это строка. После каждого имени стоит двоеточие, отделяющее имя от значения. Одна запятая отделяет значение от следующего название. Имена внутри объекта ДОЛЖНЫ быть уникальными.

ECMAScript поддерживает наследование на основе прототипов. Каждый конструктор имеет связанный прототип, и каждый объект, созданный этим конструктором, имеет неявную ссылку на прототип (называемый объектом прототип) связан с его конструктором. Кроме того, прототип может иметь ненулевую неявную ссылку на свой прототип и т. Д .; это называется прототипом цепи.

В объектно-ориентированном языке на основе классов, как правило, состояние передается экземплярами, методы - классами, а наследование - только структура и поведение. В ECMAScript состояние и методы переносятся объектами, а структура, поведение и состояние наследуются.

Прототип - это объект, используемый для реализации наследования структуры, состояния и поведения в ECMAScript. Когда конструктор создает объект, этот объект неявно ссылается на связанный с конструктором прототип с целью разрешения ссылок на свойства. Связанный с конструктором прототип может быть указанным в программном выражении constructor.prototype, а свойства, добавленные в прототип объекта, передаются по наследству всем объектам, совместно использующим прототип.

2 голосов
/ 10 августа 2016

Для тех, кто все еще думает, что RFC важнее блогов и заблуждений, основанных на мнениях, давайте попробуем ответить на некоторые вопросы. Я не собираюсь повторять все правильные различия, уже упомянутые в предыдущих ответах, здесь я просто пытаюсь добавить ценность, суммируя некоторые важные части rfc7159

Выдержки из https://tools.ietf.org/html/rfc7159

  1. JavaScript Объект Обозначение (JSON) - это текстовый формат для сериализация структурированных данных. Он получен из объекта литералы JavaScript, как определено в Программировании ECMAScript Языковой стандарт, третье издание [ECMA-262].
  2. JSON может представлять четыре примитивных типа (строки, числа, логические значения, и ноль) и два структурированных типа ( объекты и массивы).
  3. Объект представляет собой неупорядоченную коллекцию, состоящую из нуля или более имени / значения пары, где имя - это строка, а значение - строка, число, логическое значение, ноль, объект или массив.
  4. begin-object = ws% x7B ws; {левая фигурная скобка
  5. конечный объект = ws% x7D ws; } правая фигурная скобка
  6. Значение JSON ДОЛЖНО быть объектом , массивом, числом или строкой или одним из следующие три литеральных имени: false null true
  7. Структура объекта представлена ​​в виде пары фигурных скобок
  8. Имена в объекте ДОЛЖНЫ быть уникальными. объект = начало-объект [элемент * (элемент-разделитель значений)] конечный объект
  9. объект , все имена которого уникальны, является интероперабельным в том смысле, что все программные реализации, получающие этот объект , согласятся сопоставления имя-значение. Когда имена в объекте не уникальным, поведение программного обеспечения, которое получает такой объект непредсказуемы.
  10. Примеры (со страницы 12 RFC)

    Это объект JSON:

          {
            "Image": {
                "Width":  800,
                "Height": 600,
                "Title":  "View from 15th Floor",
                "Thumbnail": {
                    "Url":    "http://www.example.com/image/481989943",
                    "Height": 125,
                    "Width":  100
                },
                "Animated" : false,
                "IDs": [116, 943, 234, 38793]
              }
          }
    

    Его элемент Image является объектом , чей элемент Thumbnail является объектом и чей идентификатор член является массивом чисел.

На самом деле не существует такого понятия, как "объект JSON".

Действительно

1 голос
/ 25 мая 2010

Насколько я понимаю, основным отличием является гибкость .

JSON - это своего рода оболочка для «JavaScript Object Notation», которая заставляет пользователей подчиняться более строгим правилам определения объектов. И это достигается путем ограничения возможных способов объявления объектов, предоставляемых функцией JavaScript Object Notation.

В результате мы имеем более простые и стандартизированные объекты, которые лучше подходят для обмена данными между платформами.

Так что в основном newObject в моем примере выше - это объект, определенный с помощью JavaScript Objeect Notation; но это не «действительный» объект JSON, потому что он не следует правилам, требуемым стандартами JSON.

Эта ссылка также весьма полезна: http://msdn.microsoft.com/en-us/library/bb299886.aspx

0 голосов
/ 19 июня 2019

Вот одно удивительное отличие: вы не можете использовать undefined в json, и все поля объектов с неопределенными значениями исчезнут после JSON.stringify

let object =  { "a": undefined } ;

let badJSON= '{ "a": undefined }';


console.log('valid JS object :', object );
console.log('JSON from object:', JSON.stringify(object) );
console.log('invalid json    :', JSON.parse(badJSON) );

???

0 голосов
/ 11 июня 2019

Литерал объекта Javascript против JSON:

  • Литеральный синтаксис объекта - очень удобный способ создания объектов JavaScript
  • Язык JSON, что означает «нотация объекта Javascript», имеет синтаксис, полученный из литерального синтаксиса объекта javascript. Используется как независимый от языка программирования формат передачи текстовых данных.

Пример:

Обозначение объекта JS, используемое в JS для удобного создания объектов в коде:

const JS_Object = {
  1: 2,  // the key here is the number 1, the value is the number 2
  a: 'b', // the key is the string a, the value is the string b
  func: function () { console.log('hi') }
  // the key is func, the value is the function
}

Пример JSON:

{"widget": {
    "debug": "on",
    "window": {
        "title": "Sample Konfabulator Widget",
        "name": "main_window",
        "width": 500,
        "height": 500
    },
    "image": { 
        "src": "Images/Sun.png",
        "name": "sun1",
        "hOffset": 250,
        "vOffset": 250,
        "alignment": "center"
    },
    "text": {
        "data": "Click Here",
        "size": 36,
        "style": "bold",
        "name": "text1",
        "hOffset": 250,
        "vOffset": 100,
        "alignment": "center",
        "onMouseUp": "sun1.opacity = (sun1.opacity / 100) * 90;"
    }
}}

Основные отличия:

  • Все ключи объекта в JSON должны быть строками. В Javascript объектными ключами могут быть строки или числа

  • Все строки в JSON должны быть заключены в "двойные кавычки". В то время как в Javascript допускаются как одинарные, так и двойные кавычки. Даже без кавычек в нотации объекта Javascript ключи объекта неявно преобразуются в строки.

  • В JSON функция не может быть определена как значение объекта (поскольку это специфично для Javascript). В Javascript это полностью законно.

Javascript встроенный в JSON объект:

JSON объекты могут быть легко преобразованы в Javascript и наоборот, используя встроенный объект JSON, который Javascript предлагает во время выполнения. Например:

const Object = {
  property1: true,
  property2: false,
}; // creating object with JS object literal syntax

const JSON_object = JSON.stringify(Object);  // stringify JS object to a JSON string

console.log(JSON_object); // note that the (string) keys are in double quotes

const JS_object = JSON.parse(JSON_object);  // parse JSON string to JS object

console.log(JS_object.property1, JS_object.property2); 
// accessing keys of the newly created object
0 голосов
/ 14 мая 2018

Сначала вы должны знать, что такое JSON:

Это независимый от языка формат обмена данными. Синтаксис JSON был основан на нотации JavaScript Object Literal, но между ними есть различия.

Например, в JSON все ключи должны быть заключены в кавычки, а в объектных литералах это не обязательно:

// JSON: {"foo": "bar"}

// Литерал объекта: var o = {foo: "bar"}; Кавычки являются обязательными в JSON, потому что в JavaScript (точнее в ECMAScript 3rd. Edition) использование зарезервированных слов в качестве имен свойств запрещено, например:

var o = {if: "foo"}; // SyntaxError в ES3 Хотя использование строкового литерала в качестве имени свойства (цитирование имени свойства) не вызывает проблем:

var o = {"if": "foo"}; Так что для «совместимости» (и, может быть, легко оценить) кавычки обязательны.

Типы данных в JSON также ограничены следующими значениями:

строка число объект массив Буквально как: правда ложный ноль Грамматика строк меняется. Они должны быть разделены двойными кавычками, в то время как в JavaScript вы можете использовать одинарные или двойные кавычки взаимозаменяемо.

// Неверный JSON: {"foo": 'bar'} Принятая грамматика чисел JSON также изменяется, в JavaScript вы можете использовать шестнадцатеричные литералы, например 0xFF, или (печально известные) октальные литералы, например 010. В JSON вы можете использовать только десятичные литералы.

// Неверный JSON: {"foo": 0xFF}

...