48

我需要以 JSON 格式发送日期。日期字符串应如下所示:

“2013/5/15”

相反,JSONObject.toString将其转义如下:

“2013\ /5\ /15”

我知道这样做是为了允许脚本标签内的 json 字符串,正如这个问题所解释的: JSON:为什么正斜杠转义?

但就我而言,我不需要它。事实上,服务器正在返回一个错误。服务器没有处理这个,我无法修复服务器,所以我必须在移动客户端代码中修复它。

我可以String.replace在序列化它之后做一个,但是如果我真的想在 JSON 的任何其他部分包含“\ /”字符串怎么办?

有没有办法在不转义斜杠的情况下序列化 JSON 对象?(如果可能,不要逃避任何东西)

提前致谢。

4

5 回答 5

10

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

于 2013-05-15T12:14:57.743 回答
6
jsonObjSend.toString().replace("\\\\","")

为我工作。有点肮脏的把戏,但似乎没有其他解决方案。

于 2015-03-17T18:56:04.490 回答
5

该行为被硬编码到JSONStringer.java中,请参见 method private void string(String value), line 302+。

应该可以复制类JSONStringer并实现您自己的版本value(Object)(第 227 行+)。然后在实用程序类中实现您自己的JSONObject .toString() 版本,并使用您自己的 JSONStringer 而不是原来的。

编辑:子类化 JSONStringer 并不容易,因为 value() 调用了一个无法访问的私有方法 beforeValue()。

于 2013-05-15T12:03:25.493 回答
3

在处理编码为adat Uri“data:image/png;base64,.....”的图像数据时,我遇到了与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);
于 2017-02-03T13:56:05.503 回答
-5

问题在于进口。

使用以下进口:-

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

代替import org.json.simple.JSONObject;

它会起作用的。

看图片

于 2018-06-08T07:51:43.587 回答