jsonObject.addProperty 方法正在为其值添加不必要的引号和斜线

jsonObject.addProperty Method is adding unnecessary Quotation Marks and Slashes to it's value

这是我的字符串

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

我已将此字符串添加到我的 JsonObject,它是 com.google.gson.JsonObject 包的 class

  JsonObject jsonToSubmit = new JsonObject();

    try {

        jsonToSubmit.addProperty("token", currentTokenNo);

      } catch (Exception e) {

        e.printStackTrace();
     }

但是当我记录我的 StringJsonObject

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 的值中加上引号和斜杠?有什么合适的理由吗?

这确实妨碍了在服务器端检查字符串值的过程。

我已经完成了一个临时解决方案,通过从两侧修剪单个字符来完成任务,如下所示

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

这非常有效,但我不认为这对未来来说是个更好的主意!!!

附加信息:

变量 currentTokenNo 未如上所示直接声明,它是从 SharedPreferences 中检索的,如果直接声明则一切正常。

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

如果直接声明同一个变量,一切正常。

我们将不胜感激。

根据您的评论和 logcat 信息,从 SharedPreferences 获得的实际值是 "/SUeSjUf0A0aLFr+wVIZbw==y9iWl1SSrUe9zRQppENMNA"(带引号),而不是 /SUeSjUf0A0aLFr+wVIZbw==y9iWl1SSrUe9zRQppENMNA。这就是为什么你 jsonToSubmit : {"token":"\"/SUeSjUf0A0aLFr+wVIZbw==y9iWl1SSrUe9zRQppENMNA\""}


更新:

For your temporary solution: jsonToSubmit.addProperty("token",currentTokenNo.substring(1,currentTokenNo.length()-1));

我更喜欢以下方式:

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

如果您还想删除斜杠,请使用:

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

希望对您有所帮助!

无论你在 logcat 中得到什么都是正确的。

以下是几点以及发生这种情况的原因:

1) 您的令牌中添加了不必要的斜杠。为什么?因为您的令牌包含反斜杠 (\),这是一个转义字符。所以它会写成双斜杠(\\)而不是单斜杠(\)。

2) 您的令牌中添加了不必要的引号。为什么?同样,您的令牌是一个 String 对象,并以引号 (") 开头。因此它将被写为 \".

所以你的整体令牌从 "/SUeSjUf0A0aLFr+wVIZbw==\nLmmWtgHZ90yH0NBoATYB/A" 变为 "\"/SUeSjUf0A0aLFr+wVIZbw==\nLmmWtgHZ90yH0NBoATYB/A\""。但是您不必担心,因为无论何时您从 JsonObject 获取您的令牌数据,您将始终获得与您添加的令牌相同的令牌。

有关转义字符的详细信息,请参见此处: https://docs.oracle.com/javase/tutorial/java/data/characters.html

你发布这个已经有一段时间了,但为什么不使用 org.json.JSONObject 呢?

您不需要执行删除不必要的引号和斜杠的麻烦操作。

除非您尝试将 yourJsonObject.toString() 添加到另一个 JSONObject

我能够通过更改原始字符串的创建方式来解决这个问题,在从另一个 JsonObject 中提取字符串时使用 getAsString() 而不是 toString()

调试时,字符串会按预期引用,直到插入到新的 JsonObject 中。使用上面的子字符串方法一直有效,直到我发现使用 getAsString().

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

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

添加以防有人搜索这个旧问题。