如何使JSONObject的toString()将UTF-8字符编码为unicode,就像在PHP的json_encode中一样?

时间:2014-05-09 13:10:26

标签: java android unicode utf-8

在Java(使用Android)中,以下是代码行:

org.json.JSONObject array = new org.json.JSONObject("{\"value\":\"aész\"");
System.out.println("RES: " + array.toString());

我想要的输出:

  

RES:{“value”:“a \ u00e9sz”}

实际上是:

  

RES:{“value”:“aész”}

如何使JSONObject toString()方法返回使用UTF-8特殊字符中的unicode值编码的JSON字符串,例如json_encode(array("value", "aész"));

提前致谢。

3 个答案:

答案 0 :(得分:1)

这听起来更像是jar问题。 JsonObject是各种开源库中使用的类。下载此jar json-rpc-1.0.jar

试试这个:

JSONObject json = new JSONObject();
json.put("value", "aész");
System.out.println(json.toString());

产生:

{"Name":"u00e9sz"}

答案 1 :(得分:0)

我想你想要的是ISO-8859-1编码。这是一个很好的答案: Converting UTF-8 to ISO-8859-1 in Java - how to keep it as single byte

答案 2 :(得分:0)

如果希望它转义所有非ASCII字符,则需要构建自己版本的org.json.JSONObject类。

您需要修改的方法的签名是

 public static Writer quote(String string, Writer w) throws IOException

它在JSONObject.java中声明。它是负责格式化生成的json字符串中的所有字符串值的方法。它遍历源字符串的所有字符并发出相应的输出字符。

您正在寻找的是"默认" switch语句的一部分。

原始代码(至少在我现在正在观看的来源中)看起来像这样:

    default:
        if (c < ' ' || (c >= '\u0080' && c < '\u00a0')
                || (c >= '\u2000' && c < '\u2100')) {
            w.write("\\u");
            hhhh = Integer.toHexString(c);
            w.write("0000", 0, 4 - hhhh.length());
            w.write(hhhh);
        } else {
            w.write(c);
        }

你需要改变&#34;如果&#34;测试以匹配您要转义的所有字符。

这样做你想要的:

    default:
        if (c < ' ' || c >= '\u0080') {
            w.write("\\u");
            hhhh = Integer.toHexString(c);
            w.write("0000", 0, 4 - hhhh.length());
            w.write(hhhh);
        } else {
            w.write(c);
        }

希望这有帮助。

P.S:我遇到了你的问题,因为我遇到了同样的问题:我生成的json字符串需要通过一个只接受ascii字符并破坏任何字符&gt; 127的系统。