Java 如何使用Jackson从JSON文件加载多个hashmap

Java 如何使用Jackson从JSON文件加载多个hashmap,java,json,hashmap,jackson,Java,Json,Hashmap,Jackson,基本上,我正在使用 private void setupDictionaries() { ObjectMapper mapper = new ObjectMapper(); ArrayNode arrayNode = mapper.createArrayNode(); JsonNode rootNode = mapper.createObjectNode(); ArrayList<String> myThing = new ArrayList<S

基本上,我正在使用

private void setupDictionaries() {
    ObjectMapper mapper = new ObjectMapper();
    ArrayNode arrayNode = mapper.createArrayNode();
    JsonNode rootNode = mapper.createObjectNode();
    ArrayList<String> myThing = new ArrayList<String>();
    myThing.add("hi");
    myThing.add(".");

    itemsDict.put("cake", myThing);

    JsonNode childNode1 = mapper.valueToTree(itemsDict);
    ((ObjectNode) rootNode).set("Jan",  childNode1);
    JsonNode childNode2 = mapper.createObjectNode();
    ((ObjectNode) rootNode).set("obj2", childNode2);
    JsonNode childNode3 = mapper.createObjectNode();
    ((ObjectNode) rootNode).set("obj3", childNode3);
    String jsonString;
    try {
        jsonString = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(rootNode);
        System.out.println(jsonString);
        ObjectWriter writer = mapper.writer(new DefaultPrettyPrinter());
        writer.writeValue(new File(statsFile), jsonString);
    } catch (JsonProcessingException e2) {
        // TODO Auto-generated catch block
        e2.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}
运行此代码时,输入为:

“{\r\n\'Jan\':{\r\n\'cake\':[\'hi\',\''\']\r\n}\r\n>\'obj2\':{}\r\n\'obj3\':{}\r\n}” { “一月”:{ “蛋糕”:[“嗨”,“] }, “obj2”:{}, “obj3”:{} } (基本上是从一个文件中读取,所有内容都在一行中,在输入字符串中包含实际的json字符串时,它非常简洁,可以分成多行) 现在我只需要想办法克服这个

已解决 我必须编写根节点,而不是将jsonString写入文件

private void setupDictionaries() {
    ObjectMapper mapper = new ObjectMapper();
    ObjectWriter writer = mapper.writer(new DefaultPrettyPrinter());

    ArrayNode arrayNode = mapper.createArrayNode();
    JsonNode rootNode = mapper.createObjectNode();
    ArrayList<String> myThing = new ArrayList<String>();
    myThing.add("hi");
    myThing.add(".");

    itemsDict.put("cake", myThing);

    JsonNode childNode1 = mapper.valueToTree(itemsDict);
    ((ObjectNode) rootNode).set("Jan",  childNode1);
    JsonNode childNode2 = mapper.createObjectNode();
    ((ObjectNode) rootNode).set("obj2", childNode2);
    JsonNode childNode3 = mapper.createObjectNode();
    ((ObjectNode) rootNode).set("obj3", childNode3);
    String jsonString;
    try {
        //jsonString = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(rootNode);
        System.out.println(rootNode);
        writer.writeValue(new File(statsFile), rootNode);
    } catch (JsonProcessingException e2) {
        // TODO Auto-generated catch block
        e2.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}
private void设置字典(){
ObjectMapper mapper=新的ObjectMapper();
ObjectWriter=mapper.writer(新的DefaultPrettyPrinter());
ArrayNode ArrayNode=mapper.createArrayNode();
JsonNode rootNode=mapper.createObjectNode();
ArrayList myThing=新建ArrayList();
虚构。添加(“hi”);
虚构。添加(“.”);
物品分类。放置(“蛋糕”,神话);
JsonNode childNode1=mapper.valueToTree(itemsDict);
((ObjectNode)rootNode).set(“Jan”,childNode1);
JsonNode childNode2=mapper.createObjectNode();
((ObjectNode)rootNode).set(“obj2”,childNode2);
JsonNode childNode3=mapper.createObjectNode();
((ObjectNode)rootNode).set(“obj3”,childNode3);
字符串jsonString;
试一试{
//jsonString=mapper.writerWithDefaultPrettyPrinter().writeValueAsString(根节点);
System.out.println(rootNode);
writeValue(新文件(statsFile),rootNode);
}捕获(JsonProcessingException e2){
//TODO自动生成的捕捉块
e2.printStackTrace();
}捕获(IOE异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
}
我可以简单地用它来查询

private HashMap<String, List<String>> loadDict() {
    ObjectMapper mapper = new ObjectMapper();
    try {
        System.out.println("...");
        HashMap<String, HashMap<String, ArrayList<String>>> map = mapper.readValue(new File(statsFile), new TypeReference<HashMap<String, HashMap<String, ArrayList<String>>>>() {});
        System.out.println(map.get("Jan").get("cake").get(0));
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}
private HashMap loadDict(){
ObjectMapper mapper=新的ObjectMapper();
试一试{
System.out.println(“…”);
HashMap map=mapper.readValue(新文件(statsFile),新类型引用(){});
System.out.println(map.get(“一月”).get(“蛋糕”).get(0));
}捕获(IOE异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
}

谢谢大家

问题在于您的
类型引用
。您的示例JSON类似于
HashMap

对于
HashMap
JSON应该是

{“Jan”:[“hi”、“]”、“obj2”:[]、“obj3”:[]}

更新:

测试您的示例JSON:

public static void main(String[] args) throws JsonParseException, JsonMappingException, IOException {
    String input = "{ \"Jan\" : { \"cake\" : [ \"hi\", \".\" ] }, \"obj2\" : { }, \"obj3\" : { } }";
    ObjectMapper mapper = new ObjectMapper();
    HashMap<String, HashMap<String, ArrayList<String>>> map = mapper.readValue(input,
            new TypeReference<HashMap<String, HashMap<String, ArrayList<String>>>>() {
            });
    System.out.println(map.get("Jan").get("cake").get(0));

}
publicstaticvoidmain(字符串[]args)抛出JsonParseException、JsonMappingException、IOException{
字符串输入=“{\'Jan\':{\'cake\':[\'hi\',\''\']},\'obj2\':{},\'obj3\':{}”;
ObjectMapper mapper=新的ObjectMapper();
HashMap map=mapper.readValue(输入,
新类型引用(){
});
System.out.println(map.get(“一月”).get(“蛋糕”).get(0));
}

问题在于您的
类型引用
。您的示例JSON类似于
HashMap

对于
HashMap
JSON应该是

{“Jan”:[“hi”、“]”、“obj2”:[]、“obj3”:[]}

更新:

测试您的示例JSON:

public static void main(String[] args) throws JsonParseException, JsonMappingException, IOException {
    String input = "{ \"Jan\" : { \"cake\" : [ \"hi\", \".\" ] }, \"obj2\" : { }, \"obj3\" : { } }";
    ObjectMapper mapper = new ObjectMapper();
    HashMap<String, HashMap<String, ArrayList<String>>> map = mapper.readValue(input,
            new TypeReference<HashMap<String, HashMap<String, ArrayList<String>>>>() {
            });
    System.out.println(map.get("Jan").get("cake").get(0));

}
publicstaticvoidmain(字符串[]args)抛出JsonParseException、JsonMappingException、IOException{
字符串输入=“{\'Jan\':{\'cake\':[\'hi\',\''\']},\'obj2\':{},\'obj3\':{}”;
ObjectMapper mapper=新的ObjectMapper();
HashMap map=mapper.readValue(输入,
新类型引用(){
});
System.out.println(map.get(“一月”).get(“蛋糕”).get(0));
}

将该行更改为“HashMap map=mapper.readValue(新文件(statsFile),新类型引用(){})”,会导致相同的异常。我为您的示例添加了测试。可能问题在于您的文件内容,这与上面的示例不同。有趣的是,这正是我测试它的方式,文件的内容与输入字符串中的示例完全相同,但仍然会抛出错误。但是,如果我还创建了一个包含文件内容的输入字符串,并将.readValue作为输入而不是文件,则该字符串可以工作:(“String input=new String(Files.readAllBytes(path.get(statsFile)));HashMap map=mapper.readValue(input,new TypeReference(){});”执行此操作也会导致异常,但如果我完全复制文件中的内容,则不会出现异常。Wtf?我找到了它!我将详细信息放在了opening中。将该行更改为“HashMap=mapper.readValue”(新文件(statsFile),新类型引用(){})结果是相同的异常。我为您的示例添加了测试。可能问题在于您的文件内容,与上面的示例不同。有趣的是,这正是我尝试测试它的方式,文件的内容与输入字符串中的示例完全相同,但仍然会抛出错误。但是,如果我还使用cont创建输入字符串,只需将.readValue作为输入而不是文件,它就能工作。:(“字符串输入=新字符串(Files.readAllBytes(path.get(statsFile)));HashMap=mapper.readValue(输入,new TypeReference(){});”这样做也会导致异常,但如果我完全复制文件中的内容,则不会出现异常。Wtf?我找到了它!我在“打开”中输入了详细信息。
public static void main(String[] args) throws JsonParseException, JsonMappingException, IOException {
    String input = "{ \"Jan\" : { \"cake\" : [ \"hi\", \".\" ] }, \"obj2\" : { }, \"obj3\" : { } }";
    ObjectMapper mapper = new ObjectMapper();
    HashMap<String, HashMap<String, ArrayList<String>>> map = mapper.readValue(input,
            new TypeReference<HashMap<String, HashMap<String, ArrayList<String>>>>() {
            });
    System.out.println(map.get("Jan").get("cake").get(0));

}