2010-11-05 18 views
135

Estoy usando y necesito imprimir bastante los datos JSON (hacerlo más legibles para los humanos).Pretty-Print JSON en Java

No he podido encontrar esta funcionalidad dentro de esa biblioteca. ¿Cómo se logra esto comúnmente?

Respuesta

190

GSON puede hacer esto de una manera agradable:

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

Bueno, incluí el código para analizar una cadena en un JsonElement, normalmente ya lo tiene del trabajo anterior que hace con los datos JSON. quería incluirlo aquí para hacer el uso más claro. –

+0

Dado que esta respuesta me ayudó. He agregado el código a continuación para reducir esta declaración a menos líneas si esto es lo que está buscando public String prettifyJson (String json) { jsonElement jsonElement = new JsonParser() analizar (JSON);.... retorno nueva GsonBuilder() setPrettyPrinting() crear() toJson (jsonElement); } – ahmad

+2

es posible responder a la pregunta de la OP sin necesidad de bibliotecas adicionales, como simplemente puede acceder al analizador JSON incrustado en Rhino (JDK 1.7 y superior). No creo que sea deseable agregar una biblioteca a un proyecto solo para formatear alguna salida de depuración. 'scriptEngine.eval (" result = JSON.stringify (JSON.parse (jsonString), null, 2) ");' – Agnes

25

Parece que GSON es compatible con esto, aunque no sé si desea cambiar de la biblioteca que está utilizando.

Desde la guía del usuario:

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

El problema con GSON, es complicado, json-simple es mucho más fácil. – mabuzer

+1

No he visto este problema en más de un año, pero si está dispuesto a modificar un poco el código fuente, http://code.google.com/p/json-simple/issues/detail?id= 22 tiene algo de información sobre cómo mejorar json-simple con impresión bonita. – BuffaloBuffalo

+0

Obtengo una cadena sin ningún bonito formato de impresión :( – Cherry

92

que utilizan org.json métodos incorporados a agradable para la impresión de los datos.

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

El orden de los campos en JSON es aleatorio por definición. Un orden específico está sujeto a la implementación del analizador.

+2

También prefiero esta solución, porque no necesita importar dependencias adicionales como sugieren otras respuestas. – gdrt

6

En JSONLib puede utilizar esto:

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

Desde el Javadoc:

16

Bastante impresión con GSON en una línea:

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

Además de procesos en línea, esta es equivalente a the accepted answer.

14

Si está utilizando una API de Java para la implementación de JSON Processing (JSR-353), puede especificar la propiedad JsonGenerator.PRETTY_PRINTING al crear un JsonGeneratorFactory.

El siguiente ejemplo se publicó originalmente en mi 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

Ahora bien, esto se puede lograr con la biblioteca JSONLib:

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

Si (y sólo si) se utiliza el método sobrecargado toString(int indentationFactor) y no toString() método estándar.

He verificado esto en la siguiente versión de la API:

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

Si bien esta biblioteca puede ayudar a responder la pregunta, sería mejor incluir un _example_ de cómo es aplicable al problema con alguna _explicación_ con respecto a cómo funciona. –

+1

Ok gracias por los comentarios. Aunque recuerde, la gente como yo somos voluntarios y no nos pagan por proporcionar un servicio que garantice el cumplimiento de los estándares de calidad. Tenemos tiempo limitado porque a menudo estamos en el medio del trabajo o tenemos obligaciones familiares. Es por eso que "editar" está disponible para los lectores, por lo que podemos hacer que las publicaciones de los demás sean más útiles. –

5

En una línea:

String niceFormattedJson = JsonWriter.formatJson(jsonString) 

El libray JSON-io (https://github.com/jdereg/json-io) es un pequeño (75K) biblioteca con ninguna otra dependencia que el JDK.

Además de imprimir bastante JSON, puede serializar objetos de Java (gráficos enteros de objetos de Java con ciclos) en JSON, y también leerlos.

13

Mi situación es que mi proyecto utiliza un analizador JSON heredado (no JSR) que no admite la impresión bonita. Sin embargo, necesitaba producir muestras JSON bastante impresas; esto es posible sin tener que añadir ningún bibliotecas adicionales siempre y cuando se utiliza Java 7 y superior:

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

Esto es impresionante, use el motor js para hacerlo, mucho más simple – med116

3

Siguiendo las JSON-P 1.0 espec (JSR-353) una solución más actual para un determinado JsonStructure (JsonObject o JsonArray) podría tener este aspecto:

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

Usted puede utilizar Gson, como a continuación

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

de T que enviar JSON pretty print using Gson

Como alternativa, puede usar Jackson, como a continuación

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

Desde el puesto de Pretty print JSON in Java (Jackson)

Esperanza esta ayuda!

4

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

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

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

Sé que esto ya está en las respuestas, pero quiero escribir por separado aquí, porque lo más probable es que ya tiene Jackson como una dependencia y por lo tanto todo lo que se necesita sería una línea adicional de código

0

Esto funcionó para mí, usando Jackson:

mapper.writerWithDefaultPrettyPrinter().writeValueAsString(JSONString)