Как использовать буквенную строку JSON?

Так как формат 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?

Ответ 1

В 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 для определения объектов в конце концов!

Ответ 2

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

{"prop": "val'ue"}

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

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

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

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

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

Ответ 3

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

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

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


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