java - ¿Cómo obtengo la forma compacta de un código JSON bastante impreso?
jackson pretty-print (4)
¿Cómo hago para que el método build () de Jackson imprima de forma justa su salida JSON? Aquí hay un ejemplo que imprime en forma bonita la forma fea del código JSON. Necesito tomar la buena versión del código JSON y luego convertirlo en feo. ¿Cómo puede hacerse esto? Necesito convertir esto:
{
"one" : "AAA",
"two" : [ "BBB", "CCC" ],
"three" : {
"four" : "DDD",
"five" : [ "EEE", "FFF" ]
}
}
a esto:
{"one":"AAA","two":["BBB","CCC"],"three":{"four":"DDD","five":["EEE","FFF"]}}
Intenté eliminar los caracteres ''/ n'', ''/ t'' y ''''; pero puede haber algunos de estos caracteres en valores, así que no puedo hacer eso. Qué más se puede hacer?
Con la API de transmisión, puede usar JsonGenerator.copyCurrentEvent()
para volver a generar fácilmente la secuencia de token con cualquier impresión bonita que desee, incluido el valor predeterminado sin espacios en blanco; esto evita el almacenamiento en búfer de todo el documento en la memoria y la construcción de un árbol para el documento.
// source and out can be streams, readers/writers, etc.
String source = " { /"hello/" : /" world /" } ";
StringWriter out = new StringWriter();
JsonFactory factory = new JsonFactory();
JsonParser parser = factory.createParser(source);
try (JsonGenerator gen = factory.createGenerator(out)) {
while (parser.nextToken() != null) {
gen.copyCurrentEvent(parser);
}
}
System.out.println(out.getBuffer().toString()); // {"hello":" world "}
Puede utilizar el mismo método para imprimir de forma bonita un documento JSON de forma continua:
// reindent
gen.setPrettyPrinter(new DefaultPrettyPrinter());
Jackson le permite leer desde una cadena JSON, así que lea la cadena impresa en Jackson y luego vuelva a imprimirla con la impresión bastante deshabilitada.
Ver convertir una cadena a JSON
Ejemplo simple
String prettyJsonString = "{ /"Hello/" : /"world/"}";
ObjectMapper objectMapper = new ObjectMapper();
JsonNode jsonNode = objectMapper.readValue(prettyJsonString, JsonNode.class);
System.out.println(jsonNode.toString());
Requiere
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.5.3</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.5.3</version>
</dependency>
La forma segura es leer los datos utilizando el enlace de datos "Sin procesar" y simplemente escribirlos nuevamente sin habilitar la impresora bonita. La API de transmisión es probablemente tu amigo aquí.
Usar una expresión regular también funciona si usas este patrón: /s*/n/s*
Esto no crea la forma más compacta (es decir, todavía tendrá algunos espacios entre los elementos) pero es una solución barata si ya tiene el JSON como una cadena. La razón por la que este patrón es seguro es que las nuevas líneas no son válidas en los valores de Cadena (deben escaparse usando /n
) para que pueda eliminar de forma segura los espacios en blanco a su alrededor.
Jackosn-core es una forma de resolver, pero prefiero usar org.json
que es un json lib muy simple pero estándar para java. Abra el código fuente aquí -> stleary/JSON-java .
Maven deps
<dependency>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
<version>20160810</version>
</dependency>
uso
String payload = "{/n" +
" /"fact1/": /"Java is verbose./", /n" +
" /"fact2/" : /"C has pointers/"/n" +
"}";
System.out.println(new JSONObject(payload));
Obtendrá json compacto {"fact2":"C has pointers","fact1":"Java is verbose."}
En una línea.