Ich versuche im Grunde, mehrere (12, spezifisch) HashMap Wörterbücher in eine lokale Datei zu schreiben und sie dann abzurufen. Bisher schaffe ich es aber, wenn ich mehr als einen versuche, kann ich es im Grunde nicht schaffen. Also jede Hilfe, um dies zu tun, wird geschätzt. Hier ist mein Code so weit:Java Mehrere HashMaps in Datei schreiben
private HashMap<String, List<String>> loadDict() {
int month = Functions.getMonth();
//load back in
FileInputStream fis;
try {
fis = new FileInputStream(statsFile);
ObjectInputStream ois = new ObjectInputStream(fis);
for (int i = 0; i < 13; i++) {
//itemsDict = (HashMap) ois.readObject();
Object whatisThis = (Object) ois.readObject();
dictionaries.add(whatisThis);
}
ois.close();
fis.close();
} catch (FileNotFoundException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (ClassNotFoundException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
itemsDict = (HashMap) dictionaries.get(month);
System.out.println(itemsDict.get("cake"));
return itemsDict;
}
private void setupDictionaries() {
HashMap<String, List<String>> dictionary = new HashMap<String,List<String>>();
FileOutputStream fos;
try {
fos = new FileOutputStream(statsFile);
ObjectOutputStream oos = new ObjectOutputStream(fos);
for (int i = 0; i < 13; i++) {
oos.writeObject(dictionary);
}
oos.close();
fos.close();
} catch (FileNotFoundException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private void storeThis(String product, String price, String quantity, String date, List<List<String>> myContent) {//after set, replace dictionary in dictionaries array
dictionaries.set(Functions.getMonth(), itemsDict);
//save the dictionary to the overall statistics file
FileOutputStream fos;
try {
fos = new FileOutputStream(statsFile);
ObjectOutputStream oos = new ObjectOutputStream(fos);
for (int i = 0; i < 13; i++) {
oos.writeObject(dictionaries.get(i));
}
//oos.writeObject(itemsDict);
oos.close();
fos.close();
} catch (FileNotFoundException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
Ein bisschen Klarstellung: setupDictionaries nur auf dem ersten Lauf (Setup die Datei) aufgerufen wird, ansonsten loadDict() zur Laufzeit aufgerufen wird, alle Wörterbücher in einem Arraylist zu laden . Aus der Arraylist sollte das korrekte Objekt (hashmap) ausgewählt und dann zu itemsDict als hashmap verkettet werden. storeThis() wird aufgerufen, wenn eine Taste gedrückt wird, jedoch reduziere ich den Code auf nur relevante Bits.
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();
}
}
Frage, wie würde ich in der Lage sein, diese wieder zu laden: Ich habe
So versuche ich, die JSON Sie bisher vorgeschlagen haben zu implementieren? (Nur alles unter Jan zum Beispiel zu einem hashmap)
private HashMap<String, List<String>> loadDict() {
ObjectMapper mapper = new ObjectMapper();
try {
HashMap<String, ArrayList<String>> map = mapper.readValue(new File(statsFile), new TypeReference<HashMap<String, ArrayList<String>>>() {});
System.out.println(map.get("Jan"));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
Mit diesem Code würde ich in der Lage sein, es zu laden, jedoch bekomme ich diese Ausnahme (weil ich mehrere Hashmaps im Json habe):
JsonMappingException: Kann nicht Instanz java.util.HashMap konstruieren: keine String-Argument Konstruktor/Factory-Methode von String-Wert deserialisiert
(ich weiß nicht, wie Ausnahmen hier setzen)
Meine JSON:
"{\ r \ n \" Jan \ ": {\ r \ n \ "Kuchen \": [\. "Hallo \" \" \“] \ r \ n}, \ r \ n \ "obj2 \": {}, \ r \ n \ "obj3 \": {} \ r \ n}“
wie würde ich in der Lage sein, nur einen bestimmten Monat in eine hashmap zu laden?
Könnten Sie näher erläutern, warum Sie "es nicht zum Laufen bringen können"? Was läuft genau falsch? – Siguza
Warum importieren/exportieren Sie nicht einfach nur nach JSON? – ControlAltDel
Vielleicht schreiben Sie 13 HashMap-Wörterbücher statt 12? – hmatar