Метод jsonObject.addProperty добавляет ненужные кавычки и косые черты к своему значению

Это моя строка

String currentTokenNo = "/SUeSjUf0A0aLFr+wVIZbw==\nLmmWtgHZ90yH0NBoATYB/A"

Я добавил эту строку в свой JsonObject, который является классом com.google.gson.JsonObject пакет

  JsonObject jsonToSubmit = new JsonObject();

    try {

        jsonToSubmit.addProperty("token", currentTokenNo);

      } catch (Exception e) {

        e.printStackTrace();
     }

Но когда я регистрирую свои String и JsonObject

Log.d("mainactivityjson", "Current Token No : "+currentTokenNo );
Log.d("mainactivityjson", "jsonToSubmit : "+jsonToSubmit);

Я нашел результат

D/mainactivityjson: Current Token No : "/SUeSjUf0A0aLFr+wVIZbw==\nLmmWtgHZ90yH0NBoATYB/A"
D/mainactivityjson: jsonToSubmit : {"token":"\"/SUeSjUf0A0aLFr+wVIZbw==\\nLmmWtgHZ90yH0NBoATYB/A\""}

Теперь мой вопрос:

Почему эти кавычки и косые черты добавляются к значению JsonObject? Есть ли для этого подходящая причина?

Это действительно мешает процессу проверки значения String на стороне сервера.

Я сделал временное решение для выполнения задачи, обрезав один символ с обеих сторон, как показано ниже

jsonToSubmit.addProperty("token",currentTokenNo.substring(1,currentTokenNo.length()-1));

Это сработало отлично, но я не думаю, что это лучшая идея на будущее !!!

Дополнительная информация:

Переменная currentTokenNo не объявлена ​​напрямую, как показано выше, она была получена из SharedPreferences, и если она объявлена ​​напрямую, то все работает нормально.

String currentTokenNo = preferences.getString(LOGINCRED_TOKEN,"");

Если одна и та же переменная объявлена ​​напрямую, все работает нормально.

Любая помощь будет оценена по достоинству.


person Shree Krishna    schedule 03.01.2016    source источник
comment
Вы уверены, что переменная currentTokenNo объявлена ​​как String?   -  person miensol    schedule 03.01.2016
comment
@miensol да, я уверен!!! Он генерирует зашифрованную форму строки.   -  person Shree Krishna    schedule 03.01.2016
comment
Какой тип строки вы передаете? Делать char, const char, что-то в этом роде? Также у вас есть какая-либо кодировка, такая как UTF8 или что-то в общежитии, указывающее на это где-нибудь? Знайте, что это странный вопрос, просто чтобы лучше понять, что вы передаете.   -  person iSkore    schedule 08.01.2016
comment
он пытается избежать косых черт, что является законным.   -  person Kosh    schedule 08.01.2016
comment
@ k0sh Я знаю, что он пытается экранировать символы, но не мог понять, почему к нему добавляются кавычки ..   -  person Shree Krishna    schedule 08.01.2016
comment
Мой логарифм при использовании вашего кода: 01-07 23:18:21.490 1619-1619/com.example.gsonitunes D/mainactivityjson: Current Token No : /SUeSjUf0A0aLFr+wVIZbw== LmmWtgHZ90yH0NBoATYB/A 01-07 23:18:21.490 1619-1619/com.example.gsonitunes D/mainactivityjson: jsonToSubmit : {"token":"/SUeSjUf0A0aLFr+wVIZbw==\nLmmWtgHZ90yH0NBoATYB/A"}   -  person BNK    schedule 08.01.2016
comment
@BNK, так что я говорю, если мы объявим строку напрямую, все работает нормально, брат. ..   -  person Shree Krishna    schedule 08.01.2016
comment
Можете ли вы опубликовать logcat, используя Log.d("mainactivityjson", "Current Token No : "+currentTokenNo ); сразу после String currentTokenNo = preferences.getString(LOGINCRED_TOKEN,"");?   -  person BNK    schedule 08.01.2016
comment
@BNK Current Token No "/SUeSjUf0A0aLFr+wVIZbw==y9iWl1SSrUe9zRQppENMNA".. Извините за предыдущий номер токена. Он был заменен. Но проблема появляется только после добавления его в jsonObject.   -  person Shree Krishna    schedule 08.01.2016
comment
Как видите, значение из SharedPreferences уже заключено в кавычки, поэтому при прямом использовании оно должно быть String currentTokenNo = "\"/SUeSjUf0A0aLFr+wVIZbw==y9iWl1SSrUe9zRQppENMNA\"";   -  person BNK    schedule 08.01.2016
comment
Вы можете видеть в моем предыдущем комментарии Current Token No : /SUeSjUf0A0aLFr+wVIZbw== LmmWtgHZ90yH0NBoATYB/A (без кавычек) :)   -  person BNK    schedule 08.01.2016
comment
Давайте продолжим обсуждение в чате.   -  person Shree Krishna    schedule 08.01.2016


Ответы (4)


Из ваших комментариев и информации logcat фактическое значение, полученное из SharedPreferences, равно "/SUeSjUf0A0aLFr+wVIZbw==y9iWl1SSrUe9zRQppENMNA" (с кавычками), а не /SUeSjUf0A0aLFr+wVIZbw==y9iWl1SSrUe9zRQppENMNA. Вот почему у тебя jsonToSubmit : {"token":"\"/SUeSjUf0A0aLFr+wVIZbw==y9iWl1SSrUe9zRQppENMNA\""}


ОБНОВЛЕНИЕ:

Для вашего временного решения: jsonToSubmit.addProperty("token",currentTokenNo.substring(1,currentTokenNo.length()-1));

Я предпочитаю следующий способ:

jsonToSubmit.addProperty("token", currentTokenNo.replaceAll("\"",""));

Если вы также хотите удалить косые черты, используйте:

jsonToSubmit.addProperty("token", currentTokenNo.replaceAll("\"","").replaceAll("/",""));

Надеюсь, поможет!

person BNK    schedule 08.01.2016
comment
Если да, то как сохранить строку в SharedPreferences без кавычек. - person Shree Krishna; 08.01.2016
comment
Если вы посмотрите на XML-файл SP, вы увидите что-то вроде следующего <?xml version='1.0' encoding='utf-8' standalone='yes' ?> <map> <string name="token">_bcfPG5ToPzecCGxrosgA6AKNHgdfieuKEXxmQZUz-9ACg</string> <string name="username">[email protected]</string> </map> - person BNK; 08.01.2016
comment
И я думаю, вы должны проверить исходное значение токена, я имею в виду, что вы проверяете код, который генерирует и/или отвечает на токен. - person BNK; 08.01.2016
comment
Привет! Вы проверили, как я прокомментировал? - person BNK; 08.01.2016
comment
Да, я видел. Будет ли мое временное решение работать в будущем. - person Shree Krishna; 08.01.2016
comment
Я написал в чат!! - person Shree Krishna; 08.01.2016
comment
Давайте продолжим обсуждение в чате. - person Shree Krishna; 12.01.2016

Все, что вы получаете в своем логарифме, правильно.

Ниже приведены несколько моментов и причины, по которым это происходит:

1) К вашему токену добавлены ненужные косые черты. Почему? Поскольку ваш токен содержит обратную косую черту (\), которая является экранирующим символом. Таким образом, он будет записан как двойная косая черта (\\) вместо одинарной косой черты (\).

2) К вашему токену добавлена ​​ненужная кавычка. Почему? Опять же, ваш токен представляет собой объект String и начинается с кавычки ("). Поэтому он будет записан как \".

Таким образом, общий ваш токен изменится с "/SUeSjUf0A0aLFr+wVIZbw==\nLmmWtgHZ90yH0NBoATYB/A" на "\"/SUeSjUf0A0aLFr+wVIZbw==\\nLmmWtgHZ90yH0NBoATYB/A\"". Но вам не нужно беспокоиться, так как всякий раз, когда вы будете получать данные своего токена от JsonObject, вы всегда будете получать тот же токен, который вы добавили.

Дополнительные сведения об escape-символе см. здесь: https://docs.oracle.com/javase/tutorial/java/data/characters.html

person Geeky Singh    schedule 08.01.2016

Прошло некоторое время после того, как вы опубликовали это, но почему бы не использовать вместо этого org.json.JSONObject?

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

За исключением случаев, когда вы пытаетесь сделать что-то вроде добавления yourJsonObject.toString()в другой JSONObject.

person Divole    schedule 17.05.2016

Я смог обойти эту проблему, изменив способ создания исходной строки, используя getAsString() вместо toString() при извлечении строки из другого JsonObject.

При отладке строка будет цитироваться, как и ожидалось, пока не будет вставлена ​​в новый JsonObject. Использование метода подстроки, описанного выше, работало, пока я не обнаружил, что использую getAsString().

String ref = jsonObject.get("_ref").toString();  // ""\"url.local\"""

в то время как

String ref = jsonObject.get("_ref").getAsString();  // ""url.local""

Добавление на случай, если это поможет кому-то искать эту старую проблему.

person rawslaw    schedule 08.11.2019