web-dev-qa-db-fra.com

JSON Pretty Print en Java

J'utilise json-simple et j'ai besoin d'imprimer joliment les données JSON (de les rendre plus lisibles par l'homme).

Je n'ai pas été en mesure de trouver cette fonctionnalité dans cette bibliothèque ..___ Comment cela est-il généralement réalisé?

163
mabuzer

GSON peut le faire de façon agréable:

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

J'ai utilisé org.json des méthodes intégrées pour imprimer les données.

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

L'ordre des champs dans JSON est aléatoire par définition. Un ordre spécifique est soumis à l'implémentation de l'analyseur.

119
Raghu Kiran

Il semble que GSON le supporte, bien que je ne sache pas si vous souhaitez changer de bibliothèque.

À partir du guide de l'utilisateur:

Gson gson = new GsonBuilder().setPrettyPrinting().create();
String jsonOutput = gson.toJson(someObject);
27
BuffaloBuffalo

Si vous utilisez une implémentation d'API Java pour le traitement JSON (JSR-353), vous pouvez spécifier la propriété JsonGenerator.PRETTY_PRINTING lorsque vous créez un JsonGeneratorFactory.

L'exemple suivant a été publié à l'origine sur mon 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();
18
Blaise Doughan

Jolie impression avec GSON en une ligne:

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

En plus d'inline, cela équivaut à la réponse acceptée .

17
Bengt

Ma situation est que mon projet utilise un analyseur JSON hérité (non-JSR) qui ne prend pas en charge les jolies impressions. Cependant, j'avais besoin de produire de jolis échantillons JSON; Cela est possible sans avoir à ajouter de bibliothèques supplémentaires tant que vous utilisez Java 7 et versions ultérieures:

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");
16
Agnes

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

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

Depuis: Comment activer la jolie sortie JSON (Jackson)

Je sais que cela est déjà dans les réponses, mais je veux l'écrire séparément ici car il y a des chances que vous ayez déjà une dépendance de Jackson et que tout ce dont vous aurez besoin serait une ligne de code supplémentaire.

12
oktieh

Dans JSONLib, vous pouvez utiliser ceci:

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

Depuis le Javadoc :

 

6

En une ligne:

String niceFormattedJson = JsonWriter.formatJson(jsonString)

La bibliothèque json-io ( https://github.com/jdereg/json-io ) est une petite bibliothèque (75 Ko) sans autre dépendance que le JDK. 

En plus d’imprimer joliment JSON, vous pouvez sérialiser des objets Java (graphiques d’objets Java complets avec cycles) en JSON, ainsi que les lire.

5
John DeRegnaucourt

Maintenant, ceci peut être réalisé avec la bibliothèque JSONLib:

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

Si (et seulement si) vous utilisez la méthode toString(int indentationFactor) surchargée et non la méthode toString() standard.

J'ai vérifié cela sur la version suivante de l'API:

<dependency>
  <groupId>org.json</groupId>
  <artifactId>json</artifactId>
  <version>20140107</version>
</dependency>
5
Sridhar-Sarnobat

Suivant les spécifications JSON-P 1.0 ( JSR-353 ), une solution plus récente pour une JsonStructure (JsonObject ou JsonArray) donnée pourrait ressembler à ceci:

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;
    }

}
4
Jens Piegsa

La plupart des réponses existantes dépendent d'une bibliothèque externe ou nécessitent une version Java spéciale. Voici un code simple pour imprimer une chaîne JSON en utilisant uniquement les API Java générales (disponible dans Java 7 pour les versions plus récentes; je n'ai pas essayé l'ancienne version, bien que).

L'idée de base est de déclencher la mise en forme en fonction des caractères spéciaux en JSON. Par exemple, si un '{' ou '' 'est observé, le code créera une nouvelle ligne et augmentera le niveau d'indentation.

Clause de non-responsabilité: je n’ai testé cela que pour certains cas JSON simples (paire clé-valeur de base, liste, JSON imbriquée). Il peut donc être nécessaire de travailler sur du texte JSON plus général, comme une chaîne de caractères avec des guillemets ou des caractères spéciaux (\ n,\t etc.).

/**
 * A simple implementation to pretty-print JSON file.
 *
 * @param unformattedJsonString
 * @return
 */
public static String prettyPrintJSON(String unformattedJsonString) {
  StringBuilder prettyJSONBuilder = new StringBuilder();
  int indentLevel = 0;
  boolean inQuote = false;
  for(char charFromUnformattedJson : unformattedJsonString.toCharArray()) {
    switch(charFromUnformattedJson) {
      case '"':
        // switch the quoting status
        inQuote = !inQuote;
        prettyJSONBuilder.append(charFromUnformattedJson);
        break;
      case ' ':
        // For space: ignore the space if it is not being quoted.
        if(inQuote) {
          prettyJSONBuilder.append(charFromUnformattedJson);
        }
        break;
      case '{':
      case '[':
        // Starting a new block: increase the indent level
        prettyJSONBuilder.append(charFromUnformattedJson);
        indentLevel++;
        appendIndentedNewLine(indentLevel, prettyJSONBuilder);
        break;
      case '}':
      case ']':
        // Ending a new block; decrese the indent level
        indentLevel--;
        appendIndentedNewLine(indentLevel, prettyJSONBuilder);
        prettyJSONBuilder.append(charFromUnformattedJson);
        break;
      case ',':
        // Ending a json item; create a new line after
        prettyJSONBuilder.append(charFromUnformattedJson);
        if(!inQuote) {
          appendIndentedNewLine(indentLevel, prettyJSONBuilder);
        }
        break;
      default:
        prettyJSONBuilder.append(charFromUnformattedJson);
    }
  }
  return prettyJSONBuilder.toString();
}

/**
 * Print a new line with indention at the beginning of the new line.
 * @param indentLevel
 * @param stringBuilder
 */
private static void appendIndentedNewLine(int indentLevel, StringBuilder stringBuilder) {
  stringBuilder.append("\n");
  for(int i = 0; i < indentLevel; i++) {
    // Assuming indention using 2 spaces
    stringBuilder.append("  ");
  }
}
4
asksw0rder

Vous pouvez utiliser Gson comme ci-dessous

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

De la poste JSON jolie impression en utilisant Gson

Alternativement, vous pouvez utiliser Jackson comme ci-dessous

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

De la poste JSON en Java en Java (Jackson)

J'espère que cette aide!

4
David Pham

Cela a fonctionné pour moi, en utilisant Jackson:

mapper.writerWithDefaultPrettyPrinter().writeValueAsString(JSONString)
0
ObiWanKenobi