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();
}
但是当我记录我的 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
的值中加上引号和斜杠?有什么合适的理由吗?
这确实妨碍了在服务器端检查字符串值的过程。
我已经完成了一个临时解决方案,通过从两侧修剪单个字符来完成任务,如下所示
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""
添加以防有人搜索这个旧问题。
这是我的字符串
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();
}
但是当我记录我的 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
的值中加上引号和斜杠?有什么合适的理由吗?
这确实妨碍了在服务器端检查字符串值的过程。
我已经完成了一个临时解决方案,通过从两侧修剪单个字符来完成任务,如下所示
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""
添加以防有人搜索这个旧问题。