# Formatierung v. JSON File



## Trèfle (24. Sep 2019)

Hallo Freunde der Sonne,

ich muss für die Arbeit ein JSON-File exportieren. Verstehe soweit die Funktionen die JAVA dazu anbieten, inhaltlich ist das generierte File scheinbar auch korrekt. Nur mit der Formattierung bekomme ich es nicht ganz so hin wie es sein soll.

Mein Code sieht so in der Richtung aus:


```
import java.io.FileWriter;
import java.io.IOException;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

class Experimente {

    public static void main(String[] args) {
        try {
            
            JSONArray Personenliste = new JSONArray();
            
            JSONObject person1 = new JSONObject();
            person1.put("vorname","Roman");
            person1.put("nachname","Tisch");
            person1.put("adresse", "Sackgasse 1, Musterhausen");
            
            JSONObject sprachen1 = new JSONObject();
            sprachen1.put("Fremdsprache 1","English");
            sprachen1.put("Fremdsprache 2","Spanisch");
            
            person1.put("fremdsprachen",sprachen1);
            
            JSONObject person2 = new JSONObject();
            person2.put("vorname","Sergej");
            person2.put("nachname","Fährlich");
            person2.put("adresse", "Musterstraße 1, Boring");
            
            JSONObject sprachen2 = new JSONObject();
            sprachen2.put("Fremdsprache 1","English");
            sprachen2.put("Fremdsprache 2","Russisch");
            
            person2.put("fremdsprachen",sprachen2);
            
            Personenliste.put(person1);
            Personenliste.put(person2);
            
            JSONObject endErgebnis = new JSONObject();
            endErgebnis.put("Personenliste", Personenliste);
            
            String speicherort = "C:\\Users\\QXX7806\\Personenliste.json";
            
            try (FileWriter file = new FileWriter(speicherort)) {
                
                file.write(endErgebnis.toString());
                file.flush();
    
            } catch (IOException e) {
                e.printStackTrace();
            }
        } catch (JSONException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
    }
}
```

Wenn ich die Datei dann öffne sieht das ganze so aus:



> {"Personenliste":[{"fremdsprachen":{"Fremdsprache 2":"Spanisch","Fremdsprache 1":"English"},"vorname":"Roman","adresse":"Sackgasse 1, Musterhausen","nachname":"Tisch"},{"fremdsprachen":{"Fremdsprache 2":"Russisch","Fremdsprache 1":"English"},"vorname":"Sergej","adresse":"Musterstraße 1, Boring","nachname":"Fährlich"}]}



Folgende Dinge stöhren mich:

Zum einen sind die Attribute nicht in der Reihenfolge vorhanden in der ich sie im Code hinzufüge. Ich bräuchte das wirklich in der Korrekten Reihenfolge, also in diesem Fall 1) vorname, 2) nachname, 3) adresse, 4) fremdsprachen

Weiterhin ist stöhrend, dass alles in derselben Zeile ist. Es müsste jedes mal wenn ein neues Objekt/eine neue Liste/ein neues Attribut kommt ein Zeilenumbruch stattfinden. Am besten auch mit einrückung, so dass gleichwertige Objekte auf derselben Höhe sind. So soll das ganze idealerweise aussehen:


> {
> "Personenliste":[
> {
> "vorname":"Roman",
> ...



Ich würde mich freuen, wenn mir jemand helfen kann. Bedanke mich auch recht herzlich im Vorraus.

Liebe Grüße, Andy


----------



## httpdigest (24. Sep 2019)

JSONObject hat ein toString(int) für das Pretty-Printing: https://github.com/stleary/JSON-java/blob/master/JSONObject.java#L2288
Was die Reihenfolge der Properties angeht: Properties innerhalb eines JSON-Objektes haben keine Reihenfolge und dein Code sollte keine Annahmen über eine Reihenfolge treffen.
Wenn du definitiv eine Reihenfolge brauchst, nutze ein JSON Konstrukt, das eine Reihenfolge kennt, z.B. ein JSON Array und speichere dort Key-Value Paare.


----------



## mihe7 (24. Sep 2019)

httpdigest hat gesagt.:


> Properties innerhalb eines JSON-Objektes haben keine Reihenfolge und dein Code sollte keine Annahmen über eine Reihenfolge treffen.


Diese einfache Tatsache durfte ich mal in einem Gespräch, das gefühlt eine Ewigkeit dauerte, einem "Web Developer" und einem Spec Lead erklären. Sie haben es am Ende zwar akzeptiert, wirklich verstanden haben sie das Problem aber nicht...


----------



## Xyz1 (24. Sep 2019)

Du brauchst so etwas


```
{"Personenliste":[[{"fremdsprachen":[{"Fremdsprache 1":"English"},{"Fremdsprache 2":"Spanisch"}]},{"vorname":"Roman"},{"nachname":"Tisch"},{"adresse":"Sackgasse 1, Musterhausen"}],
[{"fremdsprachen":[{"Fremdsprache 1":"English"},{"Fremdsprache 2":"Russisch"}]},{"vorname":"Sergej"},{"nachname":"Fährlich"},{"adresse":"Musterstraße 1, Boring"}]]}
```



```
{
  "Personenliste": [
    [
      {
        "fremdsprachen": [
          {
            "Fremdsprache 1": "English"
          },
          {
            "Fremdsprache 2": "Spanisch"
          }
        ]
      },
      {
        "vorname": "Roman"
      },
      {
        "nachname": "Tisch"
      },
      {
        "adresse": "Sackgasse 1, Musterhausen"
      }
    ],
    [
      {
        "fremdsprachen": [
          {
            "Fremdsprache 1": "English"
          },
          {
            "Fremdsprache 2": "Russisch"
          }
        ]
      },
      {
        "vorname": "Sergej"
      },
      {
        "nachname": "Fährlich"
      },
      {
        "adresse": "Musterstraße 1, Boring"
      }
    ]
  ]
}
```


----------



## Xyz1 (24. Sep 2019)

Und das sortieren geht dann so...


```
var st = '{"Personenliste":[[{"fremdsprachen":[{"Fremdsprache 2":"Spanisch"},{"Fremdsprache 1":"English"}]},{"vorname":"Roman"},{"nachname":"Tisch"},{"adresse":"Sackgasse 1, Musterhausen"}],[{"fremdsprachen":[{"Fremdsprache 1":"English"},{"Fremdsprache 2":"Russisch"}]},{"vorname":"Sergej"},{"nachname":"Fährlich"},{"adresse":"Musterstraße 1, Boring"}]]}';
var obj = JSON.parse(st);

function sort1(objOrArr) {
  if (Array.isArray(objOrArr)) {
    objOrArr.sort(function (a, b) {
      if (Array.isArray(a) || Array.isArray(b)) {
        return 0;
      }
      var x = Object.keys(a); var y = Object.keys(b);
      return ((x < y) ? -1 : ((x > y) ? 1 : 0));
    });
    for (var i = 0; i < objOrArr.length; i++) {
      sort1(objOrArr[i]);
    }
  } else if (typeof objOrArr === 'object') {
    for (var prop in objOrArr) {
      sort1(objOrArr[prop]);
    }
  }
}

sort1(obj);
st = JSON.stringify(obj, null, 2);

alert(st);
```


Dabei muss aber noch gewählt werden ob Personen der Personenliste (Array) auch sortiert werden sollen und falls ja wonach... Zurzeit bleibt die Reihenfolge der Personen der Personenliste intakt


----------



## Trèfle (24. Sep 2019)

Tobias-nrw hat gesagt.:


> Und das sortieren geht dann so...
> 
> 
> ```
> ...



Danke für den Hinweis. Ich arbeite gerade in Java (nicht JavaScrupt), funktioniert das dort absolut analog?


----------



## Xyz1 (24. Sep 2019)

Ach so - Du erstellt das JSON in Java... na dann kannst Du ja beim Erstellen die Reihenfolge festlegen und musst nicht sortieren...

Sortieren geht in Java auch, aber es ist absolut un-analog...


----------



## mrBrown (24. Sep 2019)

Trèfle hat gesagt.:


> Zum einen sind die Attribute nicht in der Reihenfolge vorhanden in der ich sie im Code hinzufüge. Ich bräuchte das wirklich in der Korrekten Reihenfolge, also in diesem Fall 1) vorname, 2) nachname, 3) adresse, 4) fremdsprachen


Wofür ist denn die korrekte Reihenfolge notwendig?


----------

