Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在java中将json字符串分为两个不同的json字符串_Java_Json_Jackson - Fatal编程技术网

在java中将json字符串分为两个不同的json字符串

在java中将json字符串分为两个不同的json字符串,java,json,jackson,Java,Json,Jackson,我对json非常陌生,通常不使用json来编写代码。 我想要一个以下面的json字符串作为输入的服务 { "var": "test11", "_env": { "activation": "wm6a93e3a80-0307-12cc-96e6-d79883bf841a", "uuid": "48cdc2d0-0212-11e6-8315-d79883bf841a", "eventID": 49167, "recvTi

我对json非常陌生,通常不使用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"
} 

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


使用jackson API有什么简单的方法可以实现吗?

创建一个类来保存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);

}
这样,无论
\u 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));
}
JsonNode node=mapper.readTree(JSON);
List nodeJsons=new ArrayList();
迭代器nodeIterator=node.fields();
while(nodeIterator.hasNext()){
Map.Entry=nodeIterator.next();
add(mapper.writeValueAsString(条目));
}

通过这种方式,您将在最后拥有一个json字符串列表,每个节点都由自身序列化,而不是一个包含所有内容的“大”json。

对于动态输入,最好将json加载到映射中:

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();
    }
}
publicstaticvoidmain(字符串[]args)
{
ObjectMapper mapper=新的ObjectMapper();
try(Reader=newfilereader(“C://Temp/xx.json”)){
//将任何json加载到映射中
@抑制警告(“未选中”)
Map inMap=mapper.readValue(reader,Map.class);
系统输出打印LN(inMap);
//用于为找到的每个键生成json的exmaple
for(字符串键:inMap.keySet()){
writeValue(System.out,Collections.singletonMap(key,inMap.get(key));
}
}捕获(例外e){
e、 printStackTrace();
}
}

不需要自定义类和配置。输入中的任何内容都会加载到映射中。您可以为每个单独的键生成一个json,或者以您喜欢的任何方式互操作映射内容

您知道原始json中所有键的名称以及要分离出来的键吗?
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();
    }
}