Json Map<String, MyClass>
-
Hallo.
Eventuell kann mir jemand helfen, da ich es irgendwie nicht verstehe oder auf der Leitung stehe.
Ich will aus aus einer Map<String, MyClass> einen jsonString machen. Was ich bisher verstanden habe ist, dass ich mit einem JsonObjectBuilder meine eigenen "Strukturen" vorgeben kann. Also zB
public Person { private firstName; private lastName; // getter + setter } JsonObjectBuilder objectBuilder = Json.createObjectBuilder() .add("firstName", person.getFirstName()) .add("lastName", person.getLastName()); JsonObject jsonObject = objectBuilder.build(); ... Writer writer = new StringWriter(); Json.createWriter(writer).write(jsonObject); String jsonString = writer.toString(); ...
Man kann auch einem JsonObjectBuilder direkt eine Map<String, Object> übergeben
Map<String, Object> ms = ...; JsonObjectBuilder objectBuilder = Json.createObjectBuilder(ms); ...
Map<String, MyClass> geht nicht.
Wie kann ich dem JsonObjectBuilder nun dazu bewegen MyClass zu akzeptieren.
Json kann nur Text(String), Zahlen(BigDeimal, Integer), Boolean und null.
Ich muss dem Builder vermutlich irgendwie MyClass definieren oder bekannt machen.
Also zB ist MyClasspublic MyClass { private String string; private Integer integer; private Date date; // getter + setter
Über den ObjectBuilder kann ich MyClass wieder definieren. Das Datum müsste ich dann in einen String konvertieren (SimpleDateFormat).
Wie mache ich dem ObjectBuilder aber klar, das meine Values der Map aus MyClass bestehen?PS: es geht um das Json aus java, also javax.json.*
PPS: Ich hoffe es ist klar, was mein Problem ist, ich glaube ich erkläre es sehr kompliziert. Sorry!
-
Probiere mal Json.createBuilderFactory(Map<String,?> config) und darauf dann createObjectBuilder().
-
Sorry für die späte Antwort.
Das mit der Factory und config habe ich nicht verstanden bzw sehe ich nicht wie mir das helfen soll.
Meine Lösung sieht nun so aus, dass ich aus MyClass etwas mache was man in einem jsonString speichern kann.
Also zB wäre MyClass ein Date. Dann speichere ich in meinem jsonString die Information
a) es ist ein Date
b) das Date wandle ich in einen long umMap<String, MyClass> myMap = ... Map<String, List<Object>> jsonMap = ... for (String key : myMap.keySet()) { MyClass c = myMap.get(key); List<Object> ls = ... if (c instanceof Date) { ls = ... ls.add(Date.class.getName()); ls.add(c.getTime()); } else if ... // weitere myClass ... } jsonMap.put(key, ls); } JsonObjectBuilder objectBuilder = Json.createObjectBuilder(jsonMap); ... // builder + writer ... String jsonString = writer.toString()
Beim auslesen des jsonString mache ich das ganze dann umgekehrt. Ich weiß was für ein Datentyp es sein sollte und befülle diesen dann mit den Daten.
... String type = (String)jsonMap.get(key).get(0); Object value = jsonMap.get(key).get(1); ... if (type.equals(...)) { Date date = new Date(); long time = ((JsonNumber)value).longValue(); date.setTime(time); } ...
So wie es aussieht funktioniert das für meine Zwecke.
Ich halte es aber für maximal hässlich und bin mir sicher, dass das einfacher und besser funktioniert.