Как использовать буквенную строку JSON? - PullRequest
12 голосов
/ 01 июля 2010

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

В этом конкретном случаеВ этой ситуации у меня есть строка JSON, которая хранится в базе данных в виде текста ... поэтому база данных содержит что-то вроде {"property":"value"}, и я хочу вывести ее как часть HTML-страницы, созданной сервером, чтобы код JavaScript на этой странице выгляделчто-то вроде этого:

var x = '{"property":"value"}';

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

{"property":"val'ue"}

Тогда мне нужно ее избежать, иначе я никогда не смогучтобы использовать его как строку:

console.clear();
var obj = {prop:"val'ue"};
var str = JSON.stringify(obj);
console.log("JSON string is %s",str);
console.dir(JSON.parse(str)); //No problem here


//This obviously can't work since the string is closed and it causes an invalid script
//console.dir(JSON.parse('{prop:"val'ue"}'));

//so I need to escape it to use a literal JSON string
console.dir(JSON.parse('{"prop":"val\'ue"}'));

Тогда возникает вопрос, почему {"prop":"val\'ue"} не считается допустимой строкой JSON?

Ответы [ 3 ]

6 голосов
/ 01 июля 2010

В JavaScript - строка '{"prop":"val\'ue"}' является правильным способом кодирования JSON как строковый литерал .

Когда интерпретатор JavaScript читает строку в одинарных кавычках, он преобразует \' в '. значение строки равно {"prop":"val'ue"}, что является допустимым значением JSON.

Для того чтобы создать неверную строку JSON, вам нужно написать '{"prop":"val\\\'ue"}'

Если я правильно понял вопрос, вы пытаетесь сгенерировать код JavaScript, который установит некоторую переменную в декодированную версию строки JSON, которую вы сохранили в базе данных. Итак, теперь вы снова кодируете строку, поскольку способ получить эту строку в JavaScript - это использовать строковый литерал, передавая его через JSON.parse(). Вы, вероятно, можете использовать серверный JSON-кодировщик для кодирования строки JSON как строкового литерала JavaScript. Например:

<?php $jsonString = '{"prop":"val\'ue"}'; ?>
var myJson = JSON.parse(<?php echo json_encode($jsonString) ?>);
// Prints out: 
// var myJson = JSON.parse("{\"prop\":\"val'ue\"}");
// And results: Object - { prop: "val'ue"}

Однако, если вы на 100% уверены, что JSON будет действительным, и вам не понадобится вес дополнительного разбора / проверки ошибок - вы можете пропустить все это дополнительное кодирование и просто написать:

var myJson = <?php echo $jsonString; ?>

Помните, JSON является допустимым синтаксисом JavaScript для определения объектов в конце концов!

3 голосов
/ 01 июля 2010

Согласно jsonlint он действителен без экранирования одинарной кавычки, так что все в порядке:

{"prop": "val'ue"}

Но это неверно:

{"prop":"val\'ue"}

Согласно json.org json:

полностью не зависит от языка, но использует соглашения, которые знакомы программисты семейства C языки, в том числе C, C ++, C #, Java, JavaScript, Perl, Python и многие другие другие

Таким образом, языковые соглашения в языках c-type относительно обратного солидуса (\) означают, что ваш пример недопустим.

1 голос
/ 01 июля 2010

Вы можете попробовать следующее, однако, это ужасно.

JSON.parse("{\"obj\":\"val'ue\"}");

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


var str =  '{"obj" : "val\'ue"}';
JSON.parse(str);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...