#json
#json
Вопрос:
У меня есть строка JSON, и одно из полей является текстовым полем. Это текстовое поле может содержать текст, который пользователь вводит в пользовательском интерфейсе, и если текст, который они вводят, является текстом JSON, возможно, для иллюстрации некоторого кодирования, мне нужно закодировать их текст, чтобы он не интерпретировался как JSON в фактической структуре JSON, отправляемой на сервер.
Когда структура JSON принимается сервером и декодируется, мне нужно убедиться, что встроенный JSON декодируется как текст, который в конечном итоге выглядит как JSON в пользовательском интерфейсе.
По сути, как избежать встроенной строки JSON?
Комментарии:
1. Какая платформа? Для большинства, если не для всех, генераторов JSON, если вы дадите ему строку, он позаботится о кодировании / декодировании, и нет никакого риска, что он ошибочно декодирует строку JSON, которую вы передаете как значение.
2. Я использую Android и Java. Я также вручную генерирую строку json в коде. Я использую Gson для некоторого кодирования и декодирования, но в данном случае я делаю это вручную с помощью Gson.
3. Строка — это строка… Декодирование вашего «внешнего JSON» не приведет к автоматическому декодированию «внутреннего JSON», поскольку анализатор не знает, каково содержимое строки. Вам ничего не нужно делать.
4. @AndroidDev В этом случае просто экранируйте кавычки, как и в любом другом строковом значении. Вот и все. Однако создание собственного JSON обычно не является ни отличной идеей, ни отдаленной необходимостью, если только ваш вариант использования не очень специфичен и очень, очень ограничен по объему.
5. @AndroidDev, вам нужно экранировать не только кавычки, управляющие символы (включая новые строки) также необходимо экранировать в соответствии со спецификацией JSON. Кроме того, если JSON будет выполняться как javascript, U 2028 и U 2029 также должны быть экранированы (если они встречаются)
Ответ №1:
Я делаю нечто подобное, только с XML вместо JSON: при получении искаженных или иным образом необрабатываемых данных сервер возвращает структуру ошибок, содержащую некоторую информацию и исходные данные. Чтобы клиент не мог снова анализировать поврежденные данные, на сервере закодирован base64.
Поэтому вместо отправки
{
title : "My sample code",
payload : "{ "foo" : "bar" }"
}
рассмотрите возможность отправки
{
title : "My encoded sample code",
payload : "eyAiZm9vIiA6ICJiYXIiIH0="
}
Комментарии:
1. Интересно то, что консоль Chrome выдаст ошибку, если вы попытаетесь запустить следующее:
JSON.parse('{"title":"My sample code","payload":"{"foo":"bar"}"}');
> VM1725:1 Uncaught SyntaxError: неожиданный токен f в JSON в позиции 39 > в JSON.parse (<anonymous>) > в <anonymous>:1:62. @pilat Не совсем. Это просто непонимание того, как работает экранирование. Попробуйте
JSON.parse('{"title":"My sample code","payload":"{\"foo\":\"bar\"}"}');
. Вы уже находитесь внутри строки, поэтому вам также придется избегать обратной косой черты.