JSONObject.toString:如何不转义斜杠

mjqavswn  于 2022-12-30  发布在  其他
关注(0)|答案(6)|浏览(293)

我需要发送JSON格式的日期,日期字符串应该如下所示:
“2013年5月15日”
相反,JSONObject.toString将按如下方式对其进行转义:
二○一三年五月十五日
我知道这样做是为了允许脚本标记中包含json字符串,正如这个问题所解释的:JSON: why are forward slashes escaped?
但是在我的例子中我不需要它,事实上服务器返回了一个错误,服务器没有处理这个错误,我不能修复服务器,所以我必须在移动的客户端代码中修复它。
我可以在序列化String.replace之后再执行它,但是如果我实际上想在JSON的任何其他部分包含“\ /”字符串,该怎么办?
有没有一种方法可以在不转义斜杠的情况下序列化JSON对象?(如果可能,不转义任何内容)

yzxexxkh

yzxexxkh1#

最后我选择了一个快速而肮脏的技巧,在将序列化字符串发送到服务器之前替换其中的转义斜杠。幸运的是,JSONObject也会转义反斜杠,所以我还必须取消它们的转义。现在,如果我想有意发送“\ /”,转义字符串将是“\/”,替换的结果将是原来的字符串。

sirbozc5

sirbozc52#

这种行为被硬编码到JSONStringer.java中,参见方法private void string(String value),第302+行。
应该可以复制类JSONStringer并实现您自己版本的value(Object)(第227+行),然后在一个实用程序类中实现您自己版本的JSONObject.toString(),并使用您自己的JSONStringer而不是原来的。
编辑:子类化JSONStringer并不容易,因为value()调用了一个无法访问的私有方法。

csbfibhn

csbfibhn3#

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

对我有用。有点卑鄙的伎俩,但似乎没有其他解决办法。

nukf8bse

nukf8bse4#

在处理编码到adat URI“data:image/png a”中的图像数据时,我遇到了JSONObject“put”的类似问题。put函数将添加另一个斜线以将格式改变为“data:image/png; base64,....."。问题的根源似乎是JSONObject“put”函数中的字符串值检查,该函数添加了额外的斜杠。可能会重载该函数或扩展该类,但我发现最简单的方法是添加一个唯一的字符串(如guid),然后在调用JSONObject的toString()函数后用URI字符串替换该guid。

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);
v2g6jxz6

v2g6jxz65#

当我使用

val dateString = Gson().toJson(dateObject).toString()

您需要反序列化此JSON。

JSONObject(dateString)
cnjp1d6j

cnjp1d6j6#

问题出在进口商品上。
使用以下导入:-

import org.json.JSONException;
import org.json.JSONObject;

代替import org.json.simple.JSONObject;
会成功的。

相关问题