如何递归解析ObjectMapper.readValue中的json值?

时间:2019-04-02 03:22:13

标签: java json jackson

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

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

因此,这里有一个简短的片段可以重现问题。请注意,我无法控制实际代码中地图的生成方式。

@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个元素的列表,但是代码在转换阶段已经失败了。

1 个答案:

答案 0 :(得分:0)

您应将"[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]"替换为从中获取的任何内容。

注意:不确定应用程序逻辑