262

私はを使用しており、JSONデータをきれいに印刷する必要があります(人間が読みやすいようにする)。

そのライブラリ内でこの機能を見つけることができませんでした。これは一般的にどのように達成されますか?

4

20 に答える 20

330

グーグルのGSONはこれを素晴らしい方法で行うことができます:

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

または、JsonParserの静的解析メソッドを使用することが推奨されているため、代わりにこれを使用することもできます。

Gson gson = new GsonBuilder().setPrettyPrinting().create();
JsonElement je = JsonParser.parseString​(uglyJsonString);
String prettyJsonString = gson.toJson(je);

importステートメントは次のとおりです。

import com.google.gson.*;

Gradleの依存関係は次のとおりです。

implementation 'com.google.code.gson:gson:2.8.7'
于 2011-09-05T16:06:27.210 に答える
191

org.jsonの組み込みメソッドを使用して、データをきれいに印刷しました。

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

JSONのフィールドの順序は、定義ごとにランダムです。特定の順序は、パーサーの実装の対象となります。

于 2012-03-06T12:35:40.740 に答える
53

ジャクソンと(com.fasterxml.jackson.databind):

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

From:きれいな印刷JSON出力を有効にする方法(Jackson)

これはすでに回答に含まれていることはわかっていますが、ここで個別に記述したいと思います。なぜなら、依存関係としてすでにJacksonがあり、必要なのは追加のコード行だけだからです。

于 2017-05-21T20:18:30.140 に答える
44

使用しているライブラリから切り替えるかどうかはわかりませんが、GSONがこれをサポートしているようです。

ユーザーガイドから:

Gson gson = new GsonBuilder().setPrettyPrinting().create();
String jsonOutput = gson.toJson(someObject);
于 2010-11-05T12:37:59.020 に答える
22

JSON処理用のJavaAPI(JSR-353)実装をJsonGenerator.PRETTY_PRINTING使用している場合は、を作成するときにプロパティを指定できますJsonGeneratorFactory

次の例は、もともと私のブログ投稿で公開されています。

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();
于 2013-06-21T16:28:13.847 に答える
21

GSONを1行できれいに印刷:

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

インライン化に加えて、これは受け入れられた回答と同等です。

于 2012-10-04T19:37:46.300 に答える
19

私の状況は、私のプロジェクトがきれいな印刷をサポートしていないレガシー(非JSR)JSONパーサーを使用していることです。ただし、きれいに印刷されたJSONサンプルを作成する必要がありました。これは、Java 7以降を使用している限り、ライブラリを追加しなくても可能です。

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");
于 2015-03-17T09:02:43.063 に答える
19

orgjsonを使用します。参照リンク

JSONObject jsonObject = new JSONObject(obj);
String prettyJson = jsonObject.toString(4);

Gsonを使用します。参照リンク

Gson gson = new GsonBuilder().setPrettyPrinting().create();
String json = gson.toJson(obj);

ジャクソンを使用します。参照リンク

ObjectMapper mapper = new ObjectMapper();
mapper.enable(SerializationFeature.INDENT_OUTPUT);
String json = mapper.writeValueAsString(obj);

Gensonを使用します。参照リンク

Genson prettyGenson = new GensonBuilder().useIndentation(true).create();
String prettyJson = prettyGenson.serialize(obj);

javax.jsonを使用します。参照リンク

Map<String, Boolean> config = new HashMap<>();

config.put(JsonGenerator.PRETTY_PRINTING, true);

JsonWriterFactory writerFactory = Json.createWriterFactory(config);
Writer writer = new StringWriter();

writerFactory.createWriter(writer).write(jsonObject);

String json = writer.toString();

Moshiライブラリを使用します。参照リンク

String json = jsonAdapter.indent("  ").toJson(emp1);

(また)

Buffer buffer = new Buffer();
JsonWriter jsonWriter = JsonWriter.of(buffer);
jsonWriter.setIndent("   ");

jsonAdapter.toJson(jsonWriter, emp1);

json = buffer.readUtf8();
于 2020-02-22T14:56:49.917 に答える
16

既存の回答のほとんどは、外部ライブラリに依存しているか、特別なJavaバージョンが必要です。これは、一般的なJava APIのみを使用してJSON文字列をきれいに印刷するための簡単なコードです(Java 7以降で利用可能ですが、古いバージョンは試していません)。

基本的な考え方は、JSONの特殊文字に基づいてフォーマットを調整することです。たとえば、「{」または「[」が観察された場合、コードは新しい行を作成し、インデントレベルを上げます。

免責事項:これはいくつかの単純なJSONの場合(基本的なキーと値のペア、リスト、ネストされたJSON)でのみテストしたため、引用符が含まれる文字列値や特殊文字(\ n、\ tなど)。

/**
 * 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("  ");
  }
}
于 2018-03-29T20:29:39.613 に答える
10

これは、JSONLibライブラリを使用して実現できます。

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

toString(int indentationFactor)標準メソッドではなく、オーバーロードされたメソッドを使用する場合(およびその場合のみ)toString()

次のバージョンのAPIでこれを確認しました。

<dependency>
  <groupId>org.json</groupId>
  <artifactId>json</artifactId>
  <version>20140107</version>
</dependency>
于 2014-02-19T03:17:45.487 に答える
10

一行で:

String niceFormattedJson = JsonWriter.formatJson(jsonString)

json-io libray(https://github.com/jdereg/json-io)は、JDK以外の依存関係がない小さな(75K)ライブラリです。

JSONをきれいに印刷することに加えて、Javaオブジェクト(サイクルを含むJavaオブジェクトグラフ全体)をJSONにシリアル化し、それらを読み込むことができます。

于 2014-02-19T13:42:56.593 に答える
7

JSONLibでは、これを使用できます。

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

Javadocから:

于 2012-03-19T18:36:57.800 に答える
7

JSON-P 1.0仕様(JSR-353JsonStructure )に従うと、特定の(JsonObjectまたは)の最新のソリューションは次のJsonArrayようになります。

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

}
于 2015-09-09T13:11:57.707 に答える
5

以下のようにGsonを使用できます

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

投稿からGsonを使用したJSONプリティプリント

または、以下のようにジャクソンを使用することもできます

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

投稿からJavaでJSONをきれいに印刷する(Jackson)

この助けを願っています!

于 2016-10-06T15:19:20.310 に答える
2

更新: new JsonParser().parse(...)です@deprecated


Gson 2.8.6のjavadocに基づく:

このクラスをインスタンス化する必要はありません。代わりに静的メソッドを使用してください。

JsonParser静的メソッド:

JsonParser.parseString​(jsonString);
JsonParser.parseReader​(reader);

パッケージ:

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonParser;

例:

private Gson GSON = new GsonBuilder().setPrettyPrinting().create();
public static String getPerfectJSON(String unformattedJSON) {
    String perfectJSON = GSON.toJson(JsonParser.parseString(unformattedJSON));
    return perfectJSON;
}

Mavenを使用したGoogleGsonの依存関係:

<dependency>
    <groupId>com.google.code.gson</groupId>
    <artifactId>gson</artifactId>
    <version>2.8.6</version>
</dependency>

参照:

于 2020-08-13T14:58:35.123 に答える
1

これは、ジャクソンを使用して、私のために働いた:

mapper.writerWithDefaultPrettyPrinter().writeValueAsString(JSONString)
于 2018-02-09T01:31:51.930 に答える
1

だから私もjson-simplelibが好きで、その出力をきれいに印刷することを検討しました。残念ながら、それは未解決の問題ですが、そのためのコードは見つかりませんでした。だから私はそれを試してみようと思いました、これが私が思いついたものです(彼ら自身のソースを使用して)。

public class JsonPrinter {
  
  
  
  public static String toJson(Map<?,?> map) {
    StringBuilder out = new StringBuilder(32);
    new JsonPrinter(out).print(map);
    return out.toString();
  }
  
  
  public static String toJson(List<?> list) {
    StringBuilder out = new StringBuilder(32);
    new JsonPrinter(out).print(list);
    return out.toString();
  }
  
  
  
  
  
  
  
  private final Appendable out;
  private final String indentUnit;
  private final String newLine;
  
  
  private int indents;
  
  public JsonPrinter(Appendable out) {
    this(out, "  ", System.lineSeparator());
  }

  /**
   * 
   */
  public JsonPrinter(Appendable out, String indentUnit, String newLine) {
    this.out = Objects.requireNonNull(out, "null out");
    this.indentUnit = Objects.requireNonNull(indentUnit, "null indentUnit");
    this.newLine = Objects.requireNonNull(newLine, "null newLine");
    
    if (!indentUnit.isBlank())
      throw new IllegalArgumentException(
          "indentUnit must be a blank sequence (quoted): '" + indentUnit + "'");
    if (!"\r\n".equals(newLine) && ! "\n".equals(newLine))
      throw new IllegalArgumentException(
          "unrecognized newLine (quoted): '" + newLine + "'");
  }
  
  
  public void print(List<?> list) throws UncheckedIOException {
    try {
      assert indents == 0;
      printImpl(list);
      assert indents == 0;
    } catch (IOException iox) {
      throw new UncheckedIOException("on print(List): " + list, iox);
    }
  }
  
  
  public void print(Map<?,?> map) throws UncheckedIOException {
    try {
      assert indents == 0;
      printImpl(map);
      assert indents == 0;
    } catch (IOException iox) {
      throw new UncheckedIOException("on print(Map): " + map, iox);
    }
  }
  
  
  protected void printImpl(List<?> list) throws IOException {
    if (list == null) {
      out.append("null");
      return;
    }
    
    
    boolean first = true;
    var iter = list.iterator();
    
    open('[');
    while (iter.hasNext()) {
      if (first)
        first = false;
      else
        out.append(',');
      
      out.append(newLine);
      appendIndents();
      
      appendValue(iter.next());
    }
    close(']');
  }
  
  
  protected void printImpl(Map<?, ?> map) throws IOException {
    if (map == null) {
      out.append("null");
      return;
    }
    
    
    boolean first = true;
    var iter = map.entrySet().iterator();
    
    open('{');
    while (iter.hasNext()) {
      if (first)
        first = false;
      else
        out.append(',');
      
      out.append(newLine);
      appendIndents();
      
      var entry = iter.next();
      print(entry.getKey().toString(), entry.getValue());
    }
    close('}');
  }
  
  
  private void open(char c) throws IOException {
    out.append(c);
    ++indents;
  }
  
  private void close(char c) throws IOException {
    --indents;
    out.append(newLine);
    appendIndents();
    out.append(c);
  }
  
  private void appendIndents() throws IOException {
    for (int count = indents; count-- > 0; )
      out.append(indentUnit);
  }
  
  
  
  private void print(String key, Object value) throws IOException {
    out.append('"');
    appendString(key);
    out.append('"').append(':').append(' ');
    appendValue(value);
  }
  
  
  
  private void appendString(String s) throws IOException {
    for (int i = 0; i < s.length(); i++) {
      char ch = s.charAt(i);
      switch(ch){
      case '"':
        out.append("\\\"");
        break;
      case '\\':
        out.append("\\\\");
        break;
      case '\b':
        out.append("\\b");
        break;
      case '\f':
        out.append("\\f");
        break;
      case '\n':
        out.append("\\n");
        break;
      case '\r':
        out.append("\\r");
        break;
      case '\t':
        out.append("\\t");
        break;
      case '/':
        out.append("\\/");
        break;
      default:
                //Reference: http://www.unicode.org/versions/Unicode5.1.0/
        if ((ch>='\u0000' && ch<='\u001F') || (ch>='\u007F' && ch<='\u009F') || (ch>='\u2000' && ch<='\u20FF')) {
          String ss = Integer.toHexString(ch);
          out.append("\\u");
          for (int k=0; k < 4-ss.length(); k++) {
            out.append('0');
          }
          out.append(ss.toUpperCase());
        }
        else{
          out.append(ch);
        }
      }
    }//for
  }
  
  
  private void appendValue(Object value) throws IOException {
    if (value == null) {
      out.append("null");
      
    } else if (value instanceof String) {
      out.append('"');
      appendString(value.toString());
      out.append('"');
      
    } else if (value instanceof Double) {
      var num = (Double) value;
      if (num.isInfinite() || num.isNaN())
        out.append("null");
      else
        out.append(value.toString());
      
    } else if (value instanceof Float) {
      var num = (Float) value;
      if (num.isInfinite() || num.isNaN())
        out.append("null");
      else
        out.append(value.toString());
      
    } else if (value instanceof Map) {
      printImpl((Map<?,?>) value);
      
    } else if (value instanceof List) {
      printImpl((List<?>) value);
      
//    } else if (value instanceof Number || value instanceof Boolean) {
//      out.append(value.toString());
      
    } else {
      out.append(value.toString());
      
    }
  }

}

それは機能しJSONObjectJSONArrayそれらに依存していません。これらは規則的Mapであり、Listオブジェクトはそれぞれです。(そしてファクトコードは同じlibから削除されました)。

https://github.com/crums-io/io-util/blob/master/src/main/java/io/crums/util/json/JsonPrinter.java

于 2021-11-13T20:57:42.263 に答える
0

小さなjsonライブラリを使用できます

String jsonstring = ....;
JsonValue json = JsonParser.parse(jsonstring);
String jsonIndendedByTwoSpaces = json.toPrettyString("  ");
于 2020-02-16T19:23:17.480 に答える
0

org.json.simpleパッケージも使用しています。フォーマッターをコーディングしただけですが、作成したプログラムのJSONオブジェクトにnull、数値、ブール値がないため、文字列、オブジェクト、配列のみをコーディングしました。誰かが興味を持っているなら、これをパブリックドメインにしてください。不足しているデータ型を追加することを歓迎します(コメントに「文字列です」と記載されています)。また、インデントをパラメーターとして追加できますが、私のものは2つのスペースです。改善点をテストした後、再共有してください。

使用法printJsonObject(jsonObject, "");

機能

    public static void printJsonObject(JSONObject object, String prefix) {
        boolean notFirst = false;
        System.out.println(prefix + "{");
        for (Object key : object.keySet()) {
            if (notFirst) {
                System.out.println(", ");
            }
            notFirst = true;
            Object value = object.get(key);
            System.out.print(prefix + "  " + "\"" + key + "\"" + ": ");
            if (value instanceof JSONObject) {
                printJsonObject((JSONObject) value, prefix + "  ");
            } else if (value instanceof JSONArray) {
                printJsonArray((JSONArray) value, prefix + "  ");
            } else {  // it's a string
                System.out.print("\"" + value + "\"");
            }
        }
        System.out.println("");
        System.out.print(prefix + "}");
    }

    public static void printJsonArray(JSONArray array, String prefix) {
        boolean notFirst = false;
        System.out.println("[");
        for (Object item : array) {
            if (notFirst) {
                System.out.println(", ");
            }
            notFirst = true;
            if (item instanceof JSONObject) {
                printJsonObject((JSONObject) item, prefix + "  ");
            } else if (item instanceof JSONArray) {
                printJsonArray((JSONArray) item, prefix + "  ");
            } else {
                System.out.print(prefix + "  " + "\"" + item + "\"");
            }
        }
        System.out.println("");
        System.out.print(prefix + "]");
    }

于 2021-10-13T06:32:11.577 に答える
-2

アンダースコア-javaには静的メソッドがありますU.formatJson(json)。2、3、4、タブ、コンパクトの5つのフォーマットタイプがサポートされています。実例

import com.github.underscore.U;

import static com.github.underscore.Json.JsonStringBuilder.Step.TABS;
import static com.github.underscore.Json.JsonStringBuilder.Step.TWO_SPACES;

public class MyClass {

    public static void main(String args[]) {
        String json = "{\"Price\": {"
        + "    \"LineItems\": {"
        + "        \"LineItem\": {"
        + "            \"UnitOfMeasure\": \"EACH\", \"Quantity\": 2, \"ItemID\": \"ItemID\""
        + "        }"
        + "    },"
        + "    \"Currency\": \"USD\","
        + "    \"EnterpriseCode\": \"EnterpriseCode\""
        + "}}";
        System.out.println(U.formatJson(json, TWO_SPACES)); 
        System.out.println(U.formatJson(json, TABS)); 
    }
}

出力:

{
  "Price": {
    "LineItems": {
      "LineItem": {
        "UnitOfMeasure": "EACH",
        "Quantity": 2,
        "ItemID": "ItemID"
      }
    },
    "Currency": "USD",
    "EnterpriseCode": "EnterpriseCode"
  }
}
{
    "Price": {
        "LineItems": {
            "LineItem": {
                "UnitOfMeasure": "EACH",
                "Quantity": 2,
                "ItemID": "ItemID"
            }
        },
        "Currency": "USD",
        "EnterpriseCode": "EnterpriseCode"
    }
}
于 2019-02-02T07:33:39.880 に答える