【问题标题】:How do I make the toString() of the JSONObject encode the UTF-8 characters to unicode like in json_encode of PHP?如何使 JSONObject 的 toString() 将 UTF-8 字符编码为 un​​icode,就像 PHP 的 json_encode 中一样?
【发布时间】:2014-05-09 13:10:25
【问题描述】:

在 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"));

提前致谢。

【问题讨论】:

  • 您能否详细谈谈为什么您希望以这种方式编码输出?根据 RFC 7159,两者都是有效的 JSON,含义相同,应该以相同的方式解码。
  • 这是因为我使用的第三方API不支持非英文字符,所以如果它被编码,我可以在之后得到字符。

标签: java android unicode utf-8


【解决方案1】:

如果您希望它转义所有非 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);
        }

您需要更改“if”测试以匹配您想要转义的所有字符。

这就是你想要的:

    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 字符并破坏任何字符 >127 的系统。

【讨论】:

    【解决方案2】:

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

    试试这个:

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

    产生:

    {"Name":"u00e9sz"}
    

    【讨论】:

    • 但是请看,我希望结果用特殊字符统一编码。我不希望结果是:aész,我实际上希望它是:“a\u00e9sz”
    • 编辑了答案,试试那个罐子。 @格雷戈
    • 结果应该是{"Name":"a\u00e9sz"}吗?
    【解决方案3】:

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

    【讨论】:

    • hm,可能我没看懂怎么用 JSON String 实现,我举了一个很小的例子,你能不能试着用我给出的例子来展示一下?
    猜你喜欢
    • 2014-03-13
    • 2021-11-25
    • 2016-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-22
    相关资源
    最近更新 更多