【问题标题】:JSONObject.toString: how NOT to escape slashesJSONObject.toString:如何不转义斜杠
【发布时间】:2013-05-09 22:31:01
【问题描述】:

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

“2013/5/15”

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

“2013\ /5\ /15”

我知道这样做是为了允许脚本标签内的 json 字符串,正如这个问题所解释的: JSON: why are forward slashes escaped?

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

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

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

提前致谢。

【问题讨论】:

    标签: java android json


    【解决方案1】:

    该行为被硬编码到JSONStringer.java,参见方法private void string(String value),第302+行。

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

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

    【讨论】:

    • 也许另一个 JSON 库也会做你想做的事,例如见 google-gson
    • 你是对的。 JsonWriter.setHtmlSafe 方法似乎正是这样做的。默认设置是 false,所以我猜这个库会生成未转义的 JSON 字符串。我没有时间测试它,但如果你这样做了,我会接受这个作为解决方案:)
    【解决方案2】:

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

    【讨论】:

    • 这很奇怪怎么还在发生!! Anywho,我对 json 字符串进行了字符串替换,得到了结果字符串并将其传递给 StringEntity。它像魔术一样工作。谢谢和欢呼!!
    • 我的密码是:json.replace("\\\\", "\\")
    【解决方案3】:
    jsonObjSend.toString().replace("\\\\","")
    

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

    【讨论】:

    • jsonObjSend.toString().replace("\\","") 对我不起作用,但 jsonObjSend.toString().replace("\\\\","") 起作用。可能是什么原因?
    • 不应该是jsonObject.toString().replace("\\/","/") ???
    【解决方案4】:

    在处理编码为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);
    

    【讨论】:

      【解决方案5】:

      问题在于导入。

      使用以下导入:-

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

      而不是import org.json.simple.JSONObject;

      它会起作用的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-22
        • 1970-01-01
        • 1970-01-01
        • 2012-04-29
        • 2015-09-21
        相关资源
        最近更新 更多