【问题标题】:JsonNode Convert JSON to list of stringJsonNode 将 JSON 转换为字符串列表
【发布时间】:2017-08-04 11:28:42
【问题描述】:

我有一个这种格式的 json:

{
    "success": 1,
    "value": "[\"1-1\",\"1-2\",\"1-3\"]"
}

成功实际上是在int 和价值是StringList,我想获得价值 并将这些元素放入@ 987654325@。字符串列表将是:

1-1
1-2
1-3

我实际上希望使用 JsonNode 解析整个 json,但限制我这样做的问题是:

  1. "[\"1-1\",\"1-2\",\"1-3\"]" 用双引号括起来,所以它 可能被视为字符串。
  2. 必须去掉字符串中的反斜杠

以下是我尝试过的解决方法,是否有任何优雅/更好(没有正则表达式更好,只需将整个 json 解析为 JsonNode)的方法吗?

 ObjectMapper mapper= new ObjectMapper();
 JsonNode response = mapper.readTree(payload);  //payload is the json string
 JsonNode success = response.get("success");
 JsonNode value = response.get("value");

    if (success.asBoolean()) {
        String value = value .toString();
               value = value .replaceAll("\"", "").replaceAll("\\[", "").replaceAll("\\]", "")
                    .replace("\\", "");
       return Arrays.asList(value .split(","));
    }

【问题讨论】:

    标签: java json


    【解决方案1】:

    必须去掉字符串中的反斜杠

    不,你真的不知道。

    所以它可能被视为字符串。

    实际上是这样,并且您将其作为字符串查看这一事实是 转义字符存在的原因。

    如果您将 response.get("value").toString() 传递给 ObjectMapper 解析器,您应该返回一个数组或列表

    How to use Jackson to deserialise an array of objects

    List<String> values = MAPPER.readValue("[\"hello\", \"world\"]", new TypeReference<List<String>>(){});
    System.out.println(values); // [hello, world]
    

    另一种更优选的解决方案是修复初始 JSON 的生产者。

    【讨论】:

    • 您好,感谢您的帮助,您发布的示例是否能够解决前导和尾随双引号问题?因为我试过了,它似乎无法从 json 解析到 List&lt;String&gt;Can not deserialize instance of java.util.ArrayList out of VALUE_STRING token at [Source: "[\"1-1\",\"1-2\",\"1-3\"]";
    • mapper.readValue 应该接受 JSON 字符串,就像您的 payload 变量一样。也许只是 mapper.readTree(response.get("value").toString()); 没有 TypeReference,但这会给出一个 JsonNode,而不是 List
    猜你喜欢
    • 2021-12-08
    • 1970-01-01
    • 2020-05-23
    • 2013-10-29
    • 2018-07-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多