Formatierung v. JSON File

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:

Code:
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",
"nachname":"Tisch",
"adresse":"Sackgasse 1, Musterhausen",
"fremdsprachen":{
"Fremdsprache 1":"English",
"Fremdsprache 2":"Spanisch"
},
},
{
"vorname":"Sergej",
"nachname":"Fährlich",
"adresse":"Musterstraße 1, Boring",
"fremdsprachen":{
"Fremdsprache 1":"English",
"Fremdsprache 2":"Russisch"
}
}
]
}
Ich würde mich freuen, wenn mir jemand helfen kann. Bedanke mich auch recht herzlich im Vorraus.

Liebe Grüße, Andy
 
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.
 
Du brauchst so etwas

Code:
{"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"}]]}

Java:
{
  "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"
      }
    ]
  ]
}
 
Und das sortieren geht dann so...

Javascript:
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
 
Und das sortieren geht dann so...

Javascript:
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
Danke für den Hinweis. Ich arbeite gerade in Java (nicht JavaScrupt), funktioniert das dort absolut analog?
 
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...
 
Passende Stellenanzeigen aus deiner Region:

Oben