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));
}