2010-11-05 17 views
135

sto usando e ho bisogno di dati JSON pretty-print (renderlo più leggibile).Pretty-Print JSON in Java

non sono stato in grado di trovare questa funzionalità all'interno di tale libreria. Come si ottiene comunemente questo?

risposta

190

GSON può fare questo in modo piacevole:

Gson gson = new GsonBuilder().setPrettyPrinting().create(); 
JsonParser jp = new JsonParser(); 
JsonElement je = jp.parse(uglyJSONString); 
String prettyJsonString = gson.toJson(je); 
+1

Bene ho incluso il codice per analizzare una stringa in un JsonElement, di solito lo hai già dal lavoro precedente che fai con i dati JSON. –

+0

Poiché questa risposta mi ha aiutato.Ho aggiunto il codice qui sotto per ridurre questa affermazione a un numero inferiore di righe se questo è quello che stai cercando public String prettifyJson (String json) { JsonElement jsonElement = new JsonParser(). Parse (json); return new GsonBuilder(). SetPrettyPrinting(). Create(). ToJson (jsonElement); } – ahmad

+2

È possibile rispondere alla domanda dell'OP senza bisogno di librerie aggiuntive, come puoi semplicemente accedere al parser JSON incorporato in Rhino (JDK 1.7 e versioni successive). Non penso sia desiderabile aggiungere una libreria ad un progetto solo per formattare un output di debug. 'scriptEngine.eval (" risultato = JSON.stringify (JSON.parse (jsonString), null, 2) ");' – Agnes

25

Sembra che lo sia GSON, anche se non so se si desidera passare dalla libreria che si sta utilizzando.

Dal manuale d'uso:

Gson gson = new GsonBuilder().setPrettyPrinting().create(); 
String jsonOutput = gson.toJson(someObject); 
+3

Il problema con GSON, è complicato, json-simple è molto più semplice. – mabuzer

+1

Non ho visto questo problema tra più di un anno, ma se sei disposto a modificare un po 'il codice sorgente, http://code.google.com/p/json-simple/issues/detail?id= 22 ha alcune informazioni su come migliorare json-simple con pretty-printing. – BuffaloBuffalo

+0

Ottenuto solo una stringa senza una bella formattazione di stampa :( – Cherry

92

ho usato org.json metodi built-in a pretty-stampa i dati.

JSONObject json = new JSONObject(jsonString); // Convert text to object 
System.out.println(json.toString(4)); // Print it with specified indentation 

L'ordine dei campi in JSON è casuale per definizione. Un ordine specifico è soggetto all'implementazione del parser.

+2

Preferisco anche questa soluzione, perché non è necessario importare dipendenze aggiuntive come suggeriscono altre risposte. – gdrt

6

In JSONLib è possibile utilizzare questo:

String jsonTxt = JSONUtils.valueToString(json, 8, 4); 

Dal Javadoc:

16

stampa graziosa con GSON in una sola riga:

System.out.println(new GsonBuilder().setPrettyPrinting().create().toJson(new JsonParser().parse(jsonString))); 

Oltre inline, questo è equivalente a the accepted answer.

14

Se si utilizza un'API Java per l'implementazione JSON Processing (JSR-353), è possibile specificare la proprietà JsonGenerator.PRETTY_PRINTING quando si crea un JsonGeneratorFactory.

L'esempio che segue è stato originariamente pubblicato sul mio blog post.

import java.util.*; 
import javax.json.Json; 
import javax.json.stream.*; 

Map<String, Object> properties = new HashMap<String, Object>(1); 
properties.put(JsonGenerator.PRETTY_PRINTING, true); 
JsonGeneratorFactory jgf = Json.createGeneratorFactory(properties); 
JsonGenerator jg = jgf.createGenerator(System.out); 

jg.writeStartObject()     // { 
    .write("name", "Jane Doe")   // "name":"Jane Doe", 
    .writeStartObject("address")   // "address":{ 
     .write("type", 1)    //  "type":1, 
     .write("street", "1 A Street") //  "street":"1 A Street", 
     .writeNull("city")    //  "city":null, 
     .write("verified", false)  //  "verified":false 
    .writeEnd()       // }, 
    .writeStartArray("phone-numbers") // "phone-numbers":[ 
     .writeStartObject()    //  { 
      .write("number", "555-1111") //   "number":"555-1111", 
      .write("extension", "123") //   "extension":"123" 
     .writeEnd()      //  }, 
     .writeStartObject()    //  { 
      .write("number", "555-2222") //   "number":"555-2222", 
      .writeNull("extension")  //   "extension":null 
     .writeEnd()      //  } 
    .writeEnd()       // ] 
.writeEnd()        // } 
.close(); 
4

Ora questo può essere realizzato con la libreria JSONLib:

http://json-lib.sourceforge.net/apidocs/net/sf/json/JSONObject.html

Se (e solo se) si utilizza il toString(int indentationFactor) metodo di overload e non il metodo standard toString().

Ho verificato questo sul seguente versione delle API:

<dependency> 
    <groupId>org.json</groupId> 
    <artifactId>json</artifactId> 
    <version>20140107</version> 
</dependency> 
+2

Sebbene questa libreria possa aiutare a rispondere alla domanda, sarebbe meglio includere un _esempio_ di come sia applicabile al problema con qualche _esplanation_ riguardo a come funziona. –

+1

Ok, grazie per il feedback. Sebbene si ricordi, le persone come me sono volontari e non vengono pagati per fornire un servizio che garantisca il rispetto degli standard di qualità. Abbiamo un tempo limitato perché siamo spesso nel bel mezzo del lavoro o in famiglia. Ecco perché "edit" è disponibile per i lettori, quindi possiamo rendere più utili i post degli altri. –

5

In una linea:

String niceFormattedJson = JsonWriter.formatJson(jsonString) 

Il libray json-io (https://github.com/jdereg/json-io) è un piccolo (75K) biblioteca nessun'altra dipendenza dal JDK.

Oltre a JSON di bella stampa, è possibile serializzare oggetti Java (interi grafici di oggetti Java con cicli) su JSON, nonché leggerli in.

13

La mia situazione è il mio progetto utilizza un parser JSON legacy (non JSR) che non supporta la stampa carina. Tuttavia, avevo bisogno di produrre campioni JSON abbastanza stampati; questo è possibile senza dover aggiungere alcun librerie extra fino a quando si sta utilizzando Java 7 e superiori:

ScriptEngineManager manager = new ScriptEngineManager(); 
ScriptEngine scriptEngine = manager.getEngineByName("JavaScript"); 
scriptEngine.put("jsonString", jsonStringNoWhitespace); 
scriptEngine.eval("result = JSON.stringify(JSON.parse(jsonString), null, 2)"); 
String prettyPrintedJson = (String) scriptEngine.get("result"); 
+2

Questo è stupendo, usa il motore js per farlo, molto più semplice – med116

3

Seguendo le JSON-P 1.0 spec (JSR-353) una soluzione più corrente per un dato JsonStructure (JsonObject o JsonArray) potrebbe apparire come segue:

import java.io.StringWriter; 
import java.util.HashMap; 
import java.util.Map; 

import javax.json.Json; 
import javax.json.JsonStructure; 
import javax.json.JsonWriter; 
import javax.json.JsonWriterFactory; 
import javax.json.stream.JsonGenerator; 

public class PrettyJson { 

    private static JsonWriterFactory FACTORY_INSTANCE; 

    public static String toString(final JsonStructure status) { 

     final StringWriter stringWriter = new StringWriter(); 

     final JsonWriter jsonWriter = getPrettyJsonWriterFactory() 
       .createWriter(stringWriter); 

     jsonWriter.write(status); 
     jsonWriter.close(); 

     return stringWriter.toString(); 
    } 

    private static JsonWriterFactory getPrettyJsonWriterFactory() { 
     if (null == FACTORY_INSTANCE) { 
      final Map<String, Object> properties = new HashMap<>(1); 
      properties.put(JsonGenerator.PRETTY_PRINTING, true); 
      FACTORY_INSTANCE = Json.createWriterFactory(properties); 
     } 
     return FACTORY_INSTANCE; 
    } 

} 
2

È possibile utilizzare GSON come qui di seguito

Gson gson = new GsonBuilder().setPrettyPrinting().create(); 
String jsonString = gson.toJson(object); 

Da t egli inviare JSON pretty print using Gson

In alternativa, è possibile utilizzare Jackson come qui di seguito

ObjectMapper mapper = new ObjectMapper(); 
String perttyStr = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(object); 

Dal posto di Pretty print JSON in Java (Jackson)

Spero che questo aiuto!

4

con Jackson (com.fasterxml.jackson.core):

ObjectMapper mapper = new ObjectMapper(); 
System.out.println(mapper.writerWithDefaultPrettyPrinter().writeValueAsString(jsonObject)) 

Da: How to enable pretty print JSON output (Jackson)

So che questo è già nelle risposte, ma voglio scrivere separatamente qui perché le probabilità sono, si dispone già di Jackson come una dipendenza e quindi tutto quello che sarà necessario sarebbe una riga aggiuntiva di codice

0

Questo ha funzionato per me, utilizzando Jackson:

mapper.writerWithDefaultPrettyPrinter().writeValueAsString(JSONString)