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 MyClass

    public 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!





  • 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 um

    Map<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. 😡


Log in to reply