【问题标题】:How to remove/ignore quotation before JSON { and ] in Java如何在 Java 中删除/忽略 JSON { 和 ] 之前的引号
【发布时间】:2017-03-16 07:48:36
【问题描述】:
String param = "{\"a\":\"[\\\"x\\\",\\\"y\\\"]\",\"b\":\"{\\\"z\\\":1}\"}";

在我的例子中,{...} 和 [...] 由 " 引用。JSON 将其视为一个完整的字符串。

{
    "a": "[\"x\",\"y\"]",
    "b": "{\"z\":1}"
}

如何删除或忽略 {} 和 [] 周围的引号?我想要的结果是:

{
    "a": [
        "x",
        "y"
    ],
    "b": {
        "z": 1
    }
}

【问题讨论】:

  • 为什么引用这些块?这两个 JSON 非常不同(第一个包含字符串,第二个包含字符串的列表和映射),可能更容易对 JSON 的源进行操作。你对源头有控制权吗?
  • 您可以做的另一件事:如果您知道“a”和“b”包含类似的字符串...您可以提取这些字符串并将它们作为单独的 JSON 再次解析
  • 我知道你在说什么,但我从第三方获取数据并且无法更改。而且,“a”“b”只是一个简单的例子,真实的路径是不确定的,而且数据通常嵌套很深。如果只有一个解析器,我可以自定义将“{...}”或“[.....]”视为列表和映射。

标签: java json escaping quote


【解决方案1】:

最安全的解决方案是使用 JSON 解析器来解析和重新序列化每个值。下面是一个使用 Jackson 的示例:

String param = "{\"a\":\"[\\\"x\\\",\\\"y\\\"]\",\"b\":\"{\\\"z\\\":1}\"}";

ObjectMapper mapper = new ObjectMapper();
ObjectNode root = mapper.readValue(param, ObjectNode.class);
root.set("a", mapper.readTree(root.get("a").asText()));
root.set("b", mapper.readTree(root.get("b").asText()));
System.out.println(mapper.writeValueAsString(root));

输出:

{"a":["x","y"],"b":{"z":1}}

【讨论】:

  • 例子很简单,“a”和“b”不是SURE,实际数据嵌套很深。
  • @waterystone 那么就不可能正确解决,因为没有什么可以区分实际的 JSON 和包含 JSON 的字符串。除非您想将任何潜在的 JSON 视为实际的 JSON。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-31
  • 1970-01-01
  • 1970-01-01
  • 2015-10-23
  • 2020-04-12
  • 1970-01-01
相关资源
最近更新 更多