我需要用JSON发送日期。日期字符串应如下所示:
“2013年5月15日”
相反,JSONObject.toString
将其转义如下:
“2013 \ / 5 \ / 15”
我知道这样做是为了允许脚本标记内的json字符串,因为这个问题解释了: JSON: why are forward slashes escaped?
但在我的情况下,我不需要它。实际上服务器返回错误。服务器没有处理这个,我无法修复服务器,所以我必须在移动客户端代码中修复它。
序列化后我可以做String.replace
,但如果我真的想在JSON的任何其他部分包含“\ /”字符串怎么办?
有没有办法在不转义斜杠的情况下序列化JSON对象? (如果可能,不逃避任何事情)
提前致谢。
答案 0 :(得分:6)
我终于选择了在将序列化字符串中的转义斜杠替换为发送到服务器之前的快速而肮脏的技巧。幸运的是,JSONObject也会逃避反斜杠,所以我也必须取消它们。现在,如果我想故意发送“\ /”,则转义字符串将为“\\ /”,替换结果为原始字符串。
答案 1 :(得分:3)
该行为已硬编码到JSONStringer.java中,请参阅方法private void string(String value)
,第302行+。
应该可以复制班级JSONStringer
并实施您自己的value(Object)
版本(第227+行)。然后在实用程序类中实现您自己的JSONObject。toString()版本,并使用您自己的JSONStringer而不是原始版本。
编辑:对JSONStringer进行子类化并不容易,因为value()在无法访问的VALue()之前调用私有方法。
答案 2 :(得分:1)
jsonObjSend.toString().replace("\\\\","")
为我工作。有点肮脏的技巧,但似乎没有其他解决方案。
答案 3 :(得分:0)
我遇到了与JSONObject类似的问题" put"当处理被编码为adat的图像的数据时,数据:image / png; base64,....."。 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);
答案 4 :(得分:-2)
问题在于进口。
使用以下导入: -
import org.json.JSONException;
import org.json.JSONObject;
而不是import org.json.simple.JSONObject;
它会起作用。