В чем разница между JSON и Object Literal Notation?

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

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

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

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

Ответ 1

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

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

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

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

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


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

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

  • Клавиши < должны быть строками (т.е. последовательность символов, заключенная в двойные кавычки ").
  • Значения могут быть:
    • строка
    • число
    • объект (JSON)
    • массив
    • <код > Trueкод >
    • <код > ложькод >
    • <код > нулевымкод >
  • Повторяющиеся ключи ( { "foo" : "bar", "foo" : "baz" }) производят undefined, конкретные для реализации результаты; спецификация JSON специально не определяет их семантику

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

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

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

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

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

  var obj = {foo: 42};//создает объект JavaScript (это * not * JSON)
 var json = '{  "foo" : 452}';//создает строку, содержащую JSON
Код>

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


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

Ответ 2

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

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

Ответ 3

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

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

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

Ответ 4

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

JSON - это subset объекта буквальное обозначение JavaScript.

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

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

Ответ 5

🔫 JSON: альтернатива Fat-Free для XML

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


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

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

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

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

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 Corporation).). Хотя до 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 PDF.
2nd Edition, August 1998 PDF.
3rd Edition, December 1999 PDF.
5th Edition, December 2009 PDF.
5.1 Edition, June 2011 HTML.
6th Edition, June 2015 HTML.
7ᵗʰ Edition, June 2016 HTML.
8th edition, June 2017 HTML.
9th Edition, 2018 HTML.

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


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

  • ► Значения ключа должны быть указаны, для клавиш доступны только строки. Если вы используете иначе, чем String, он преобразуется в String. Но не рекомендуется использовать ключи, отличные от String. Пример: { 'key':'val' } над 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() {}' ] );
    
  • ► Строки JSON должны быть указаны как "и не". Строка очень похожа на строку C или Java. Строки должны быть заключены в двойные кавычки.

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

    Проверьте этот код { "Hai\" \n Team 🔫":5, "Bye \'": 7 } над онлайн-версиями JSON Edtions. Modes notStrict , 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"}
    

введите описание изображения здесь


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

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

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. Когда конструктор создает объект, этот объект неявно ссылается на связанный с конструкторами прототип с целью разрешения ссылок на свойства. Конструктор, связанный с прототипом, может ссылаться на конструктор конструктора program.prototype, а свойства, добавленные в прототип объектов, совместно используются через наследование всеми объектами, совместно использующими прототип.

Ответ 6

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

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

  • JavaScript Объект Обозначение (JSON) - это текстовый формат для сериализация структурированных данных. Он получен из объекта литералы JavaScript, как определено в Программе ECMAScript Language Standard, третье издание [ECMA-262].
  • JSON может представлять четыре примитивных типа (строки, числа, булевы, и null) и два структурированных типа ( объекты и массивы).
  • Объект - неупорядоченный набор из нуля или более имени/значения пары, где имя - это строка, а значение - строка, число, boolean, null, объект или массив.
  • begin-object= ws% x7B ws; {левая фигурная скобка
  • конечный объект= ws% x7D ws; } правая фигурная скобка
  • Значение JSON ДОЛЖНО быть объектом, массивом, числом или строкой или одним из следующие три буквальных имени: false null true
  • Структура объекта представлена ​​в виде пары фигурных скобок
  • Имена внутри объекта ДОЛЖНЫ быть уникальными. объект= begin-object [член * (элемент-разделитель значений)]           конечный объект
  • Объект , имена которого уникальны, совместим в смысле что все программные реализации, получающие этот объект, согласятся сопоставления имен. Когда имена внутри объекта не являются уникальное поведение программного обеспечения, которое получает такой объект, является непредсказуемы.
  • Примеры (со страницы 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".

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

Ответ 7

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

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

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

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

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

Ответ 8

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

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

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

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

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

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

var o = {"if": "foo"}; Таким образом, для "совместимости" (и, возможно, простое eval'ing возможно?) Цитаты являются обязательными.

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

string number object array Литерал как: true false null Грамматика строк изменяется. Они должны быть разделены двойными кавычками, в то время как в JavaScript вы можете использовать одиночные или двойные кавычки взаимозаменяемо.

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

//Недействительный JSON: {"foo": 0xFF}

Ответ 9

Javascript Object Literal против 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

Ответ 10

Вот одно удивительное отличие: вы не можете использовать 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) );