【发布时间】:2011-09-03 13:49:24
【问题描述】:
使用 JSON-lib 的 JSONObject 时,如何阻止 put 方法将包含 JSON 的字符串存储为 JSON 而不是转义字符串?
例如:
JSONObject obj = new JSONObject();
obj.put("jsonStringValue","{\"hello\":\"world\"}");
obj.put("naturalStringValue", "\"hello world\"");
System.out.println(obj.toString());
System.out.println(obj.getString("jsonStringValue"));
System.out.println(obj.getString("naturalStringValue"));
打印:
{"jsonStringValue":{"hello":"world"},"naturalStringValue":"\"hello world\""}
{"hello":"world"}
"hello world"
我希望它打印出来:
{"jsonStringValue":"{\"hello\":\"world\"}","naturalStringValue":"\"hello world\""}
{"hello":"world"}
"hello world"
是的,我知道这很讨厌。但是,这是为了支持 JSON 序列化管道,为了互操作性,这是预期的行为。在某些情况下,我们会序列化可能是/包含有效 JSON 的用户输入。我们不希望用户输入成为我们将所述输入序列化到的 JSON 对象的一部分。
手动转义不起作用,因为它会导致 JSON-lib 转义 \ 字符:
JSONObject obj = new JSONObject();
obj.put("naturalJSONValue","{\"hello\":\"world\"}");
obj.put("escapedJSONValue", "{\\\"hello\\\":\\\"world\\\"}");
System.out.println(obj.toString());
System.out.println(obj.getString("naturalJSONValue"));
System.out.println(obj.getString("escapedJSONValue"));
输出:
{"naturalJSONValue":{"hello":"world"},"escapedJSONValue":"{\\\"hello\\\":\\\"world\\\"}"}
{"hello":"world"}
{\"hello\":\"world\"}
此时,任何启用手动选择性转义复杂 JSON 对象的解决方法都会完全否定使用 JSON-lib 的价值。
另外,我知道有人问过这个问题before,但不幸的是我不能这么轻易地接受它的答案。 JSON-lib 是我项目的许多领域中大量使用的依赖项,将其换出将是一项艰巨的任务。在我可以考虑换成 Jackson、simple-json 或 Gson 之前,我需要绝对确定没有办法使用 JSON-lib 实现这一目标。
【问题讨论】:
标签: java json serialization json-lib