Има ли някаква практическа причина да се използват низове в кавички за JSON ключове?

Според json.org на Crockford, JSON обект е съставен от членове, който се състои от двойки.

Всяка двойка е съставена от низ и стойност, като низ се дефинира като:

Низът е поредица от нула или повече Unicode символи, обвити в двойни кавички, използващи обратна наклонена черта. Символът се представя като низ от един символ. Низът е много подобен на C или Java низ.

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

Има ли смисъл да си правите труда да ограждате своя JSON в двойни кавички?

Валиден пример:

{
  "keyName" : 34
}

За разлика от невалидното:

{
   keyName : 34
}

person Mark Rogers    schedule 17.11.2010    source източник
comment
Защо да си правите труда да го правите правилно? Това е вид мързеливо мислене, което води до уебсайтове, натоварени с невалидно маркиране. Поддържайте кода си в бъдеще, в случай че някой браузър изисква двойни кавички.   -  person meagar    schedule 17.11.2010
comment
Защо да си правите труда да го правите правилно? - Защо да си правите труда да следвате конвенция, която никой друг не прави, ако няма реална полза? Може би бъркате мързеливото мислене с прагматизма.   -  person Mark Rogers    schedule 17.11.2010
comment
@Mark - това никой друг не го прави... откъде ти хрумна тази идея? JSON сериализаторът, вграден във всяка голяма платформа, прави правилно цитиране.   -  person Nick Craver    schedule 17.11.2010
comment
@Nick Craver - Попитайте средностатистическия си уеб разработчик, вероятно ще получите подозрителен поглед. Тъй като повечето браузъри позволяват невалиден json, повечето не знаят за това изискване за валидност.   -  person Mark Rogers    schedule 17.11.2010
comment
@Mark Rogers Функцията PHP json_encode създава валиден JSON, например с низове в двойни кавички. Може би мислите за обектни литерали в JavaScript? Вярно е, че те работят без цитиране на ключовете, но това не е JSON.   -  person JAL    schedule 17.11.2010
comment
@Mark - Никакви браузъри не позволяват невалиден JSON в своя JSON.parse() (какво друго бихте използвали?), Показах демонстрация на това в отговора по-долу.   -  person Nick Craver    schedule 17.11.2010
comment
За протокола, преди години, когато публикувах това, бях объркан относно разликата между JSON и нотацията на обектния литерал, както предложи @JAL. Двамата имат много сходен синтаксис, което в крайна сметка доведе до известно объркване при описанието на проблема.   -  person Mark Rogers    schedule 15.04.2015
comment
@MarkRogers Може би трябва да споменете това недоразумение като редакция на първоначалния въпрос? В противен случай това може да обърка някои хора.   -  person ba_ul    schedule 29.08.2015
comment
@ba_ul - Предпочитам да го оставя така, за да могат хората да проследят разсъжденията, започвайки от недоразумението.   -  person Mark Rogers    schedule 29.08.2015


Отговори (3)


Истинската причина защо JSON ключовете трябва да са в кавички се основава на семантиката на идентификаторите на ECMAScript 3.

Запазените думи не могат да се използват като имена на свойства в Обектни литерали без кавички, например:

({function: 0}) // SyntaxError
({if: 0}) // SyntaxError
({true: 0}) // SyntaxError
// etc...

Въпреки че, ако използвате кавички, имената на свойствата са валидни:

({"function": 0}) // Ok
({"if": 0}) // Ok
({"true": 0}) // Ok

Собственият Крокфорд го обяснява в този разговор, те искаха за да поддържат стандарта JSON прост и не биха искали да имат всички тези семантични ограничения върху него:

....

Тогава открихме проблема с нецитираното име. Оказва се, че ECMA Script 3 има политика за запазена дума. Запазените думи трябва да бъдат цитирани в ключовата позиция, което наистина е неудобство. Когато стигнах до формулирането на това в стандарт, не исках да поставям всички запазени думи в стандарта, защото би изглеждало наистина глупаво.

По онова време се опитвах да убедя хората: да, можете да пишете приложения на JavaScript, наистина ще работи и е добър език. Тогава не исках да кажа в същото време: и вижте това наистина глупаво нещо, което направиха! Затова реших, вместо това, нека просто цитираме ключовете.
По този начин не е нужно да казваме на никого колко е ужасно.

Ето защо и до днес ключовете се цитират в JSON.

...

Стандартът ECMAScript 5th Edition коригира това, сега в реализация на ES5 дори запазените думи могат да се използват без кавички както в обектните литерали, така и в членския достъп (obj.function Добре в ES5).

Само за протокола, този стандарт се внедрява в наши дни от доставчици на софтуер, можете да видите кои браузъри включват тази функция на този таблица за съвместимост (вижте Резервирани думи като имена на свойства)

person Christian C. Salvadó    schedule 17.11.2010
comment
@Марк, няма за какво. Имайте предвид, че JSON е просто език-агностик формат за обмен на данни, дори синтаксисът му да е вдъхновен от синтаксиса на Javascript Object Literal, има разлики между тях (много повече от ключовете в кавички) . - person Christian C. Salvadó; 17.11.2010
comment
@CMS, защо трябва да има само двойни кавички? Защо единичните кавички са невалидни в JSON? - person Pacerier; 02.05.2014
comment
Единичните кавички не са разрешени, за да се запази стандартът JSON възможно най-прост. JSON трябва да бъде само подмножество на Javascript, не е необходимо да внедрява колкото се може повече Javascript. - person thomasrutter; 10.08.2017
comment
Спецификацията на надмножеството JSON5 се придържа към синтаксиса на ES5 и по този начин поддържа ключове без кавички, наред с други неща. Библиотеката има съвместими parse и stringify методи. - person Inigo; 04.05.2020
comment
В тази връзка към таблицата за съвместимост (в долната част на отговора) записът Резервирани думи е под секцията Разширения на литерали на обект/масив. И TL;DR, всички изброени браузъри (всички, за които сте чували и още около 20) казват Да. - person i336_; 29.06.2020

Да, това е невалиден JSON и ще бъде отхвърлен в противен случай в много случаи, например jQuery 1.4+ има проверка, която прави JSON без кавички тихо неуспешен. Защо не бъдете съвместими?

Да вземем друг пример:

{ myKey: "value" }
{ my-Key: "value" }
{ my-Key[]: "value" }

...всички те би били валидни с кавички, защо не сте последователни и не ги използвате във всички случаи, елиминирайки възможността за проблем?

Още един често срещан пример в света на уеб разработчиците: Има хиляди примери за невалиден HTML, който се изобразява в повечето браузъри... това прави ли по-малко болезнено отстраняването на грешки или поддръжката? Съвсем не, точно обратното.

Освен това @Матю прави най-добрата гледна точка в коментарите по-долу, това вече се проваля, ключовете без кавички ще изведат синтактична грешка с JSON.parse() във всички основни браузъри (и всички други, които го прилагат правилно), можете да го тествате тук.

person Nick Craver    schedule 17.11.2010
comment
Да, имах някои стари ajax приложения, генериращи schonky json от страна на сървъра, които се провалиха при надграждане до jquery 1.4 поради липсата на двойни кавички около имената на ключовете. - person JAL; 17.11.2010
comment
Може да добавите, че JSON.parse на всички основни браузъри също ще го отхвърли правилно. - person Matthew Flaschen; 17.11.2010
comment
Любопитен съм, в какъв случай точно JQuery 1.4 ще се провали тихо с този тип невалиден json? - person Mark Rogers; 17.11.2010
comment
@Mark - Във всеки случай не е правилно цитиран или има невалидни знаци... основно ще се провали с невалиден JSON. - person Nick Craver; 17.11.2010
comment
Това е интересно, това не е моят опит с JQuery 1.4. Освен това, не мисля, че jquery е отговорен за създаването на json обекти, не е ли това, което прави javascript интерпретаторът на браузъра? Имате предвид Jquery json десериализация? - person Mark Rogers; 17.11.2010
comment
@Mark Rogers Да, не успява при десериализация. Това имах предвид в коментара си - имах PHP страница, изпращаща json като {cow:47,duck:"flapping left"} и когато беше извлечена чрез $.getJSON или $.ajax с dataType json, с Content-Type на application/json, тя се провали. Данните бяха декодирани до null. Този невалиден json обаче работи добре в jQuery 1.3.x. - person JAL; 17.11.2010

YAML, който всъщност е надмножество на JSON, поддържа това, което искате да направите. Въпреки че е суперкомплект, той ви позволява да го поддържате толкова прост, колкото искате.

YAML е глътка свеж въздух и може би си струва да отделите време да го разгледате. Най-доброто място да започнете е тук: http://en.wikipedia.org/wiki/YAML

Има библиотеки за всеки език под слънцето, включително JS, напр. https://github.com/nodeca/js-yaml

person user1649339    schedule 26.08.2013
comment
YAML не е надмножество на JSON. - person John Gibb; 01.04.2014
comment
за информация защо: stackoverflow.com/questions/25974485/ - person Ben Page; 29.02.2016