Как кодировать JSON, встроенный в JSON

#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:6

2. @pilat Не совсем. Это просто непонимание того, как работает экранирование. Попробуйте JSON.parse('{"title":"My sample code","payload":"{\"foo\":\"bar\"}"}'); . Вы уже находитесь внутри строки, поэтому вам также придется избегать обратной косой черты.