• Fabian Wetzel
  • 2007-10-26
  • 2 min. read

Einen JSON-String formatieren

Wie bereits öfter schon hier erwähnt, arbeite ich zur Zeit an einer Webanwendung. Natürlich nutze ich auch AJAX! Allerdings nutze ich zur Übergabe nicht XML sondern JSON. Ich nutze auf der Serverseite SOJO um zwischen Java-Objekten nach JSON hin und her zu konvertieren.

Leider ist der erzeugte JSON-String eine lange Zeile ohne Leerzeichen und Zeilenumbrüchen. Das stört ungemein, wenn man mal gucken will, ob das richtige übermittelt wird. Ich hatte mich also auf die Suche nach einem JSON Formatter gemacht, nur leider gibt quasi nur einen, der benötigt aber Copy&Paste des Strings, da ich ihn nicht einbetten kann. Nun hab ich mir schnell eine Java-Funktion geschrieben, die einen JSON String in einen lesbaren umwandelt. Ich hoffe es nützt wem!

Es gab Probleme mit Backslashes hier in dem Blog, sollte es bei euch also nicht funktionieren, dann schaut zuerst danach!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
public String makeReadable(String json) {
StringBuilder sb = new StringBuilder();
int indent = 0;
boolean inString = false;
char lastChar = ' ';
char c;
for (int i = 0; i < json.length(); i++) {
// Schleife für jedes Zeichen
c = json.charAt(i);
if (c == '"' && lastChar != '\\') {
inString = !inString;
}
if (inString) {
// innerhalb Strings darf nichts geändert werden!
sb.append(c);
} else {
// normales Verhalten außerhalb eines Strings
switch (c) {
case '\n':
case ' ':
case '\t':
// alte Formatierungen entfernen
break;
case '[':
sb.append("\n");
appendIndents(sb, indent);
sb.append(c);
sb.append("\n");
appendIndents(sb, ++indent);
break;
case '{':
sb.append(c);
sb.append("\n");
appendIndents(sb, ++indent);
break;
case '}':
case ']':
sb.append("\n");
appendIndents(sb, –indent);
sb.append(c);
break;
case ':':
sb.append(' ');
sb.append(c);
sb.append(' ');
break;
case ',':
sb.append(c);
sb.append('\n');
appendIndents(sb, indent);
break;
default:
sb.append(c);
}
}
lastChar = c;
}
return sb.toString();
}

private void appendIndents(StringBuilder sb, int indent) {
for (int i = 0; i < indent; i++) {
sb.append("\t");
}
}