Formatierung v. JSON File

Diskutiere Formatierung v. JSON File im XML und Co. Bereich.
Trèfle

Trèfle

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
 
H

httpdigest

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

mihe7

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...
 
T

Tobias-nrw

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"
      }
    ]
  ]
}
 
T

Tobias-nrw

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
 
Trèfle

Trèfle

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?
 
T

Tobias-nrw

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...
 
M

mrBrown

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?
 
Thema: 

Formatierung v. JSON File

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben