在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特殊字符(如json_encode(array("value","aész"));)的unicode值编码的JSON字符串
提前致谢。
您能否谈谈为什么要以这种方式对输出进行编码? 两者都是符合RFC 7159的有效JSON,含义相同,并且应以相同的方式解码。
这是因为我使用的第三方API Im不支持非英语字符,因此如果将其编码,则可以在以后获取字符。
听起来更像jar问题。 JsonObject是跨各种开源库使用的类。下载此jar json-rpc-1.0.jar
尝试这个:
JSONObject json = new JSONObject();
json.put("value","aész");
System.out.println(json.toString());
产生:
{"Name":"u00e9sz"}
但是请看,我希望结果不会出现在特殊字符中。 我不希望结果是:asz,我实际上希望它是:" a u00e9sz"
编辑答案,尝试那个罐子。 @格雷戈
结果应该是{"Name":"a\u00e9sz"}吗?
如果希望它转义所有非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的字符的系统传输。
我想您想要的是ISO-8859-1编码。这是一个很好的答案:
在Java中将UTF-8转换为ISO-8859-1-如何使其保持为单字节
嗯,也许我不明白如何在JSON字符串中实现,我举了一个很小的例子,您能否尝试用我给出的例子来展示?