JSONObject.toString: как НЕ удалять слэши
Мне нужно отправить дату в JSON. Строка даты должна выглядеть так:
"2013/5/15"
Вместо этого JSONObject.toString
выполняется следующим образом:
"2013 \/5 \/15"
Я понимаю, что это сделано, чтобы позволить json-строкам внутри тегов скриптов, поскольку этот вопрос объясняет:
JSON: почему экраны сперва не отображаются?
Но в моем случае мне это не нужно. На самом деле сервер возвращает ошибку. Сервер не справляется с этим, и я не могу исправить сервер, поэтому я должен исправить его в коде мобильного клиента.
Я мог бы сделать String.replace
после его сериализации, но что, если я действительно хотел включить строку "\/" в любую другую часть JSON?
Есть ли способ сериализации объекта JSON без экранирования косой черты? (Если возможно, не избегая ничего)
Спасибо заранее.
Ответы
Ответ 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);