Подтвердить что ты не робот

JSONObject.toString: как НЕ удалять слэши

Мне нужно отправить дату в JSON. Строка даты должна выглядеть так:

"2013/5/15"

Вместо этого JSONObject.toString выполняется следующим образом:

"2013 \/5 \/15"

Я понимаю, что это сделано, чтобы позволить json-строкам внутри тегов скриптов, поскольку этот вопрос объясняет: JSON: почему экраны сперва не отображаются?

Но в моем случае мне это не нужно. На самом деле сервер возвращает ошибку. Сервер не справляется с этим, и я не могу исправить сервер, поэтому я должен исправить его в коде мобильного клиента.

Я мог бы сделать String.replace после его сериализации, но что, если я действительно хотел включить строку "\/" в любую другую часть JSON?

Есть ли способ сериализации объекта JSON без экранирования косой черты? (Если возможно, не избегая ничего)

Спасибо заранее.

4b9b3361

Ответ 1

Я, наконец, выбрал быстрый и грязный трюк по замене экранированных косых черт в сериализованной строке перед отправкой на сервер. К счастью, JSONObject также избегает обратных косых черт, поэтому я должен также их не использовать. Теперь, если я хочу отправить "\/" намеренно, экранированная строка будет "\\/", и результат замены будет исходной строкой, как предполагалось.

Ответ 2

Это поведение жестко закодировано в JSONStringer.java, см. метод private void string(String value), строка 302 +.

Должно быть возможно скопировать класс JSONStringer и реализовать собственную версию value(Object) (строка 227+). Затем выполните свою собственную версию JSONObject.toString() в классе утилиты и используйте собственный JSONStringer вместо оригинала.

EDIT: Подкласс JSONStringer не будет легким, потому что value() вызывает закрытый метод beforeValue(), к которому невозможно получить доступ.

Ответ 3

jsonObjSend.toString().replace("\\\\","")

Работал для меня. Немного грязный трюк, но не похоже на другое решение.

Ответ 4

У меня была аналогичная проблема с JSONObject "put" при работе с данными для изображения, которое было закодировано в данные adat Uri: image/png; base64,..... ". Функция put добавила бы другую косую черту, чтобы изменить формат на" data: image/png; base64,.....". Похоже, что источником проблемы является проверка строкового значения внутри функции "put" JSONObject, которая добавляет дополнительные слэши. Возможно, можно перегрузить функцию или расширить класс, но я нашел, что самый простой способ - добавить уникальную строку, такую ​​как guid, а затем заменить это руководство вашей строкой Uri после вызова функции toString() вашего JSONObject.

JSONObject userJson = new JSONObject(); 
String myimageUri = "data:image/png;base64,XXXDATAXXX";
userJson.put("imageUri", "b0c8f13d-48b1-46b4-af28-4e2d8004a6f8");
userJson.toString().replace("b0c8f13d-48b1-46b4-af28-4e2d8004a6f8", myimageUri);