# JSON to String



## Dimadon (19. Jun 2017)

Ich bräuchte mal Hilfe bezüglich der Konvertierung eines JSON-Arrays in einen String.


```
Map<String, String> attr= message.getAttributes();
```

Als Output bekomme ich nun als Beispiel: {id=31231, nID=232332}

Kann mir hier jemand eventuell weiterhelfen wie ich das konvertieren kann?

Ich bedanke mich bereits jetzt für eure Hilfe!!


----------



## Thallius (19. Jun 2017)

Wie sieht denn das JSON aus? Und was erwartest du? Aus deiner Frage lässt sich nicht erkennen wascdu willst


----------



## Dimadon (19. Jun 2017)

Das JSON hat die Form:

 attributes:{id=12,did=1789}
usw.

Bekomme grade mit der Methode gerade nur den Output hin. 
Ich hätt gern jedes Attribut einzeln damit ich das in einer Datenbank abspeichern kann.


----------



## Thallius (19. Jun 2017)

Das ist aber kein valides JSON. Ein JSON sieht anders aus


----------



## mrBrown (19. Jun 2017)

Also in deiner Ursprungsfrage hast du eine gefüllte Map und deren Ausgabe mit toString, wo soll da JSON sein?


----------



## Dimadon (19. Jun 2017)

Die komplette JSON Message die ich erhalte hat diese Form:

{"message":{"data":"dGVzdA==","attributes":{},"messageId":"91010751788941","publishTime":"2017-04-05T23:16:42.302Z"}}

Aus dieser Message bekomme ich mit:

```
Entity msg= new Entity("PubsubMessage");  
msg.setProperty("message", new String(message.decodeData(), "UTF-8"));
```

Die Message in korrekter Form. Nun brauche ich noch die Attribute einzeln. Mit:


```
Map<String, String> attr= message.getAttributes();
```

bekomme ich zwar die Attribute jedoch wie bereits oben geschrieben in der Form: {id=31231, nID=232332}


----------



## mrBrown (19. Jun 2017)

Dimadon hat gesagt.:


> ```
> Map<String, String> attr= message.getAttributes();
> ```
> 
> bekomme ich zwar die Attribute jedoch wie bereits oben geschrieben in der Form: {id=31231, nID=232332}



Wie gesagt, das ist die Ausgabe von Map#toString.
Du musst schon einzeln auf die Attribute zugreifen, wenn du Zugriff auf einzelne Attribute willst.


----------



## Dimadon (19. Jun 2017)

Genau...Aber wie? Habe hier eine for-schleife gedacht aber bin hier etwas überfragt gerade...Wäre für Hilfe hier sehr dankbar..


----------



## mrBrown (19. Jun 2017)

Wenn du Maps noch nicht verstanden hast, würde ich noch mal 3, 4 Schritte zurück gehen - das was du aktuell machst, dürfte dann etwas zu kompliziert sein.


----------



## JuKu (20. Jun 2017)

Du musst durch die Map manuell iterierten.
Mit map.entrySet(), wenn ich mich nicht irre.

Also z.B.:

```
for (Map.Entry<String,String> entry : map.entrySet()) {
    String key = entry.getKey();
    String value = entry.getValue();

    //do something
}
```


----------



## mrBrown (20. Jun 2017)

JuKu hat gesagt.:


> Du musst durch die Map manuell iterierten.


manuell iterieren und foreach sind aber zwei paar Schuhe


----------



## RalleYTN (20. Jun 2017)

JuKu hat gesagt.:


> Du musst durch die Map manuell iterierten.
> Mit map.entrySet(), wenn ich mich nicht irre.
> 
> Also z.B.:
> ...


Geht einfacher mit:

```
map.forEach((key, value) -> {
    // do something
});
```
Und dann würde man ganz einfach die Einträge auf einen StringBuilder schreiben.
Hierbei muss man jedoch darauf achten, dass alles richtig maskiert wird. Also Zeilenumrüche müssen im Wert zu "\n" umgewandelt werden und so'n Zeug.
Einfach Beispiel:

```
StringBuilder builder = new StringBuilder();
builder.append('{');
boolean first = true; // Hilfswert um nur die nötige Menge an Kommas zu bekommen
map.forEach((key, value) -> {
    if(first) first = false; else builder.append(',');
    builder.append('"').append(key).append('":"').append(escape(value) /* Die escape Funktion soll dann die Dinge wie Zeilenumbrüche, Tabulatoren, etc. maskieren*/).append('"');
});
builder.append('}');
String jsonString = builder.toString();
```



Dimadon hat gesagt.:


> Ich bräuchte mal Hilfe bezüglich der Konvertierung eines



Das ein JSON-Objekt und nicht ein JSON-Array.


----------



## mrBrown (20. Jun 2017)

RalleYTN hat gesagt.:


> Geht einfacher mit:
> 
> ```
> map.forEach((key, value) -> {
> ...



Mit dem Unterschied, dass sein Beispiel auch lauffähig ist 


Ich bin mir aber auch immer noch nicht sicher, was jetzt eigentlich sein Problem ist...


----------



## RalleYTN (20. Jun 2017)

mrBrown hat gesagt.:


> Mit dem Unterschied, dass sein Beispiel auch lauffähig ist



Was macht mein Beispiel nicht lauffähig? 
Eclipse sagt, dass funkzt.


----------



## mrBrown (20. Jun 2017)

`first` ist nicht "effectively final" und `'":"'` klappt so auch nicht


----------



## RalleYTN (20. Jun 2017)

mrBrown hat gesagt.:


> `first` ist nicht "effectively final" und `'":"'` klappt so auch nicht


natürlich! Wenn man immer gleich alles ins Forum schreibt und nicht erst in die IDE.


----------



## Dimadon (20. Jun 2017)

Super vielen Dank für die Hilfe


----------



## mrBrown (20. Jun 2017)

Dimadon hat gesagt.:


> Super vielen Dank für die Hilfe


Was war denn jetzt die passende Hilfe?


----------



## Dimadon (20. Jun 2017)

RalleYTN hat gesagt.:


> Geht einfacher mit:
> 
> ```
> map.forEach((key, value) -> {
> ...




Der StringBuilder war eine super Idee.... Ich habe die einzelnen Werte davor auch am Beispiel userID mit:


```
Map<String, String> attr = message.getAttributes();
        String uId = (String) attr.get("userId");
```

herausbekommen...


----------



## mrBrown (20. Jun 2017)

Statt selbst den JSON-String zusammenzubasteln könntest du auch einfach vernünftige Objekte und nen Mapper wie Jackson oder GSON nutzen, das erscheint mir der sinnvollere Ansatz...


----------



## Thallius (20. Jun 2017)

Bin ja selten MrBrowns Meinung aber da muss ich ihm mal recht gebe. Was soll denn dieses rumgefummel? Fehleranfälliger geht es kaum


----------



## RalleYTN (21. Jun 2017)

Ich persönlich nutze auch eine etwas abgewandelte Version von JsonSimple.
Link zum Original: https://github.com/fangyidong/json-simple



Thallius hat gesagt.:


> Fehleranfälliger geht es kaum


Beim Erstellen von JSON anhand einer Map ist das einzige was wirklich schief gehen kann die Maskierung von speziellen Zeichen wie Zeilenumbruch, Tabulator und anderen.


----------



## mrBrown (21. Jun 2017)

Bei größeren Objekten muss man ja schon für JsonSimple ziemlich Masochistisch veranlagt sein...


----------



## JuKu (21. Jun 2017)

Oder er nutzt einfach die org.json Library.


----------



## mrBrown (21. Jun 2017)

JuKu hat gesagt.:


> Oder er nutzt einfach die org.json Library.





mrBrown hat gesagt.:


> Bei größeren Objekten muss man ja schon für JsonSimple ziemlich Masochistisch veranlagt sein...


Ersetz JsonSimple durch org.json.


----------



## JuKu (23. Jun 2017)

Ich weiß, was du meinst. 
Aber direkte Objekt Serialisierung hat auch Nachteile, natürlich auch viele Vorteile.


----------



## mrBrown (23. Jun 2017)

Mit fällt ehrlich gesagt bei JsonSimple und Konsorten kein Vorteil ein, der nicht (in so ziemlich allen Fällen) von den Nachteilen aufgewogen wird...


----------



## JuKu (24. Jun 2017)

Wenn du weitere Attribute in den Klassen hast, die nicht mit geschrieben werden sollen z.B.
Oder wenn sich die Klassenstruktur ändert (z.B. Attribut wird umbenannt usw.), kannst du das Objekt nicht mehr laden.


----------



## mrBrown (24. Jun 2017)

Natürlich geht das^^
Gibt genügend Annotations für die Fälle, und im Zweifel kann man immer noch passende Serialiser für einzelne (Teil-)Elemente einbinden


----------



## JuKu (27. Jun 2017)

Bedeutet dann aber zusätzliche Arbeit (Annotations usw.).
Aber wir weichen hier vom Thema ab.


----------



## mrBrown (27. Jun 2017)

JuKu hat gesagt.:


> Bedeutet dann aber zusätzliche Arbeit (Annotations usw.).


Meinst du das Ernst?  Eine Annotation, die gleichzeitig auch noch Doku ist, vs. zig Zeilen, um das händisch zu lösen, ist "zusätzliche Arbeit"?

Ich hätte ja mit dem Performance-Argument gerechnet, das gilt da noch am ehesten...


----------



## JuKu (29. Jun 2017)

Für verschiedene Versionen...

Aber lass uns diese Sache beiseite legen, das ist nicht Gegenstand dieses Threads.


----------

