2011-05-31 15 views
35

Tengo una cadena JSON compacta, y quiero formatearla muy bien en Java sin tener que deserializarla primero, p. al igual que jsonlint.org lo hace. ¿Hay alguna biblioteca por ahí que proporcione esto?¿Cómo imprimo bastante los datos JSON existentes con Java?

Una solución similar para XML también sería agradable.

+0

Por letra bonita, ¿quiere decir color-código, sangría, o ambos? – Eric

+20

JSONObject tiene un 'toString (int)' donde proporciona espacio para una impresión bonita. –

+0

@Eric: solo sangría. – neu242

Respuesta

3

Creo que para imprimir algo bonito, es muy útil conocer su estructura.

Para obtener la estructura que tiene que parse él. Debido a esto, no creo que sea mucho más fácil que primero analizar la cadena JSON que tiene y luego usar el método bonito de impresión toString mencionado en los comentarios anteriores.

Por supuesto, puede hacer lo mismo con cualquier biblioteca JSON que desee.

5

Si está utilizando Jackson se puede lograr fácilmente esto con la configuración de un SerializationFeature en su ObjectMapper:

com.fasterxml.jackson.databind.ObjectMapper mapper = new ObjectMapper(); 

mapper.configure(SerializationFeature.INDENT_OUTPUT, true); 

mapper.writeValueAsString(<yourObject>); 

Eso es todo.

9

En una línea:

String niceFormattedJson = JsonWriter.formatJson(jsonString) 

o

System.out.println(JsonWriter.formatJson(jsonString.toString())); 

El libray JSON-io (https://github.com/jdereg/json-io) es un pequeño (75K) de la biblioteca sin otras dependencias que el JDK.

Además de impresión bonita JSON, puede serializar objetos Java (gráficos de todo objeto Java con ciclos) a JSON, así como leerlos en.

+0

Usó esta pequeña biblioteca, con algunas modificaciones en el formato de salida. Gracias por informarme al respecto. –

+0

No solo fue esta la primera solución para trabajar en mi entorno, ¡finalmente me confirmó que sé cómo usar Gradle para extraer de forma adecuada las bibliotecas de terceros! Un buen día, gracias! – Shadoninja

43
int spacesToIndentEachLevel = 2; 
new JSONObject(jsonString).toString(spacesToIndentEachLevel); 

Usando org.json.JSONObject (integrado en JavaEE y androide)

+1

¿Qué biblioteca usa esto? Como es, no es una respuesta muy útil. –

+0

@Andrew Backer, esto no es una biblioteca. Como dijo Heath Borders, está integrado en las bibliotecas de Android. He probado esto y funciona perfectamente sin ninguna biblioteca. – tambykojak

+1

Hm ... No estoy desarrollando para Android, y no despliego en un contenedor Java EE ... de ahí la necesidad de aclaración. Gracias por agregar eso :) Entonces, para alguien como yo, distribuyendo una aplicación java dirigida al SE, sería una biblioteca como 'org.json: json: 20090211'? –

1

I fOUNT una solución muy simple: código

<dependency> 
    <groupId>com.cedarsoftware</groupId> 
    <artifactId>json-io</artifactId> 
    <version>4.5.0</version> 
</dependency> 

Java:

import com.cedarsoftware.util.io.JsonWriter; 
//... 
String jsonString = "json_string_plain_text"; 
System.out.println(JsonWriter.formatJson(jsonString)); 
0

Otra forma de utilizar GSON:

String json_String_to_print = ... 
Gson gson = new GsonBuilder().setPrettyPrinting().create(); 
JsonParser jp = new JsonParser(); 
return gson.toJson(jp.parse(json_String_to_print)); 

Puede ser utilizado cuando usted no tiene el grano como en el post de susemi99.

Cuestiones relacionadas