【问题标题】:How to recursively parse json value in ObjectMapper.readValue?如何递归解析 ObjectMapper.readValue 中的 json 值?
【发布时间】:2019-08-23 07:01:05
【问题描述】:

我正在尝试使用 Jackson ObjectMapper 将 json 字符串中的 json 字符串解析为对象。但我找不到一个干净的方法来做到这一点。

我有一个 SQL 表,将列表存储为 json 字符串,例如 "[1,2,3]"。我将所有列读入 Map 然后尝试使用 objectMapper.convertValue 制作成 Java 对象。

所以这里有一个快速的 sn-p 来重现问题。请注意,我不控制在实际代码中如何生成地图。

@Data
public class Main {
    private List<Integer> bar;

    public static void main(String[] args) throws Exception{
        ObjectMapper objectMapper = new ObjectMapper();
        Map<String, Object> objectMap = new HashMap<String, Object>();
        objectMap.put("bar", "[1,2,3]");
        // Main foo = objectMapper.convertValue(objectMap, Main.class)
        String json = objectMapper.writeValueAsString(objectMap);
        Main foo = objectMapper.readValue(json, Main.class);

        System.out.println(foo.getBar());
    }
}

但这是不对的。 ObjectMapper 没有解析字符串,而是尝试将 String 直接转换为 List,但失败了。我希望 foo.getBar() 返回一个包含 3 个元素的 List,但代码在转换阶段已经失败。

【问题讨论】:

  • 尝试使用"[{1},{2},{3}]"。并确保您在Main 中声明了一个字段,即@JsonProperty("bar") List&lt;Integer&gt;;

标签: java json jackson


【解决方案1】:

您应该将"[1,2,3]" 设置为String[] 所以:

"[1,2,3]".replaceAll("\\[", "").replaceAll("\\]", "").replaceAll("\\s", "").split(",")

类似:

public static void main(String[] args) throws Exception {
    ObjectMapper objectMapper = new ObjectMapper();
    Map<String, Object> objectMap = new HashMap<String, Object>(){{
        put("bar", "[1,2,3]".replaceAll("\\[", "")
                            .replaceAll("]", "")
                            .replaceAll("\\s", "").split(","));
    }};

    String json = objectMapper.writeValueAsString(objectMap);
    Main foo = objectMapper.readValue(json, Main.class);

    System.out.println(foo.getBar());
}

您只需将 "[1,2,3]" 替换为您从中获得的任何内容。

注意:不确定应用逻辑

【讨论】:

  • 问题是我无法编辑地图。我正在寻找某种使 objectmapper 解析字符串而不是尝试直接转换它的注释。
猜你喜欢
  • 2011-05-05
  • 1970-01-01
  • 2018-09-30
  • 1970-01-01
  • 2012-01-17
  • 2015-03-08
  • 2020-05-31
  • 2016-10-17
  • 1970-01-01
相关资源
最近更新 更多