将json字符串剪切为java中的两个不同的json字符串

时间:2016-04-14 08:10:40

标签: java json jackson

我对json很新,通常不会使用很多编码。 我想要一个以json字符串作为输入

的服务
{
    "var": "test11",
    "_env": {
        "activation": "wm6a93e3a80-0307-12cc-96e6-d79883bf841a",
        "uuid": "48cdc2d0-0212-11e6-8315-d79883bf841a",
        "eventID": 49167,
        "recvTime": "Thu Apr 14 00:27:03 PDT 2016"
    }
}

并将输出吐出为

{
    "var": "test11"
} 

{
    "_env": {
        "activation": "wm6a93e3a80-0307-12cc-96e6-d79883bf841a",
        "uuid": "48cdc2d0-0212-11e6-8315-d79883bf841a",
        "eventID": 49167,
        "recvTime": "Thu Apr 14 00:27:03 PDT 2016"
    }
}

这只是一个例子。它可以在json字符串中包含更多对象,并且_env不会总是出现在最后。

有没有简单的方法来实现使用jackson API?

2 个答案:

答案 0 :(得分:3)

创建一个类来保存您的JSON,如下所示:

public class Bar {

    private String var;

    @JsonProperty("_env")
    private Object env;

    public String getVar() {
        return var;
    }

    public void setVar(String var) {
        this.var = var;
    }

    public Object getEnv() {
        return env;
    }

    public void setEnv(Object env) {
        this.env = env;
    }
}

在反序列化之前将映射器设置为在未知属性上不失败;

public static void main(String[] argv) throws Exception {
    ObjectMapper mapper = new ObjectMapper();
    mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);

    Bar bar = mapper.readValue(JSON, Bar.class);

}

这样,无论何时_env存在,它都会起作用。

如果你需要按每个节点“拆分”json,你可以这样做:

JsonNode node = mapper.readTree(JSON);
List<String> nodeJsons = new ArrayList<>();
Iterator<Entry<String, JsonNode>> nodeIterator = node.fields();
while (nodeIterator.hasNext()) {
    Map.Entry<String, JsonNode> entry = nodeIterator.next();
    nodeJsons.add(mapper.writeValueAsString(entry));
}

这样你最终会得到一个json字符串列表,每个节点都是自己序列化的,而不是一个带有所有东西的“大”json。

答案 1 :(得分:1)

使用动态输入时,最好将json加载到Map:

public static void main(String[] args)
{
    ObjectMapper mapper = new ObjectMapper();
    try (Reader reader = new FileReader("C://Temp/xx.json")) {
        // load whatever json into Map
        @SuppressWarnings("unchecked")
        Map<String, Object> inMap = mapper.readValue(reader, Map.class);
        System.out.println(inMap);
        // exmaple for generating json for each key found 
        for (String key : inMap.keySet()) {
            mapper.writeValue(System.out, Collections.singletonMap(key, inMap.get(key)));
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

无需自定义类和模糊的jackson配置。输入中的任何内容都会加载到Map中。你可以为每个单独的密钥生成一个json,或者以你喜欢的方式与地图内容交互