24

Jackson の build() メソッドで JSON 出力をきれいに印刷するにはどうすればよいですか? これは、醜い形式の JSON コードをきれいに出力する例です。JSON コードの適切なバージョンを取得して、それを醜い形式に変換する必要があります。どうすればそれができますか?これを変換する必要があります:

 {
   "one" : "AAA",
   "two" : [ "BBB", "CCC" ],
   "three" : {
     "four" : "DDD",
     "five" : [ "EEE", "FFF" ]
   }
 }

これに:

{"one":"AAA","two":["BBB","CCC"],"three":{"four":"DDD","five":["EEE","FFF"]}}

「\n」、「\t」、「 」の文字を削除しようとしました。しかし、値にこれらの文字が含まれている可能性があるため、それはできません。他に何ができますか?

4

4 に答える 4

25

Jackson では JSON 文字列から読み取ることができるため、きれいに印刷された文字列を Jackson に読み込んでから、きれいな印刷を無効にして再度出力します。

文字列から JSON への変換を参照してください

簡単な例

    String prettyJsonString = "{ \"Hello\" : \"world\"}";
    ObjectMapper objectMapper = new ObjectMapper();
    JsonNode jsonNode = objectMapper.readValue(prettyJsonString, JsonNode.class);
    System.out.println(jsonNode.toString());

必要

<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>
于 2012-08-29T08:57:25.393 に答える
7

ストリーミング API を使用JsonGenerator.copyCurrentEvent()すると、既定の空白なしを含め、任意のプリティ プリントを適用して、トークン ストリームを簡単に再出力できます。これにより、ドキュメント全体をメモリにバッファリングしたり、ドキュメントのツリーを構築したりする必要がなくなります。

// 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 "}

同じアプローチを使用して、JSON ドキュメントをストリーミング形式で整形することができます。

// reindent
gen.setPrettyPrinter(new DefaultPrettyPrinter());
于 2013-09-13T02:05:36.787 に答える
5

安全な方法は、「Raw」データバインディングを使用してデータを読み取り、きれいなプリンターを有効にせずに再度書き込むことです。ストリーミング APIはおそらくあなたの味方です。

このパターンを使用する場合、正規表現の使用も機能します。\s*\n\s*

これは最もコンパクトなフォームを作成しません (つまり、要素間にスペースが残ります) が、既に JSON を文字列として持っている場合は安価なソリューションです。このパターンが安全である理由は、文字列値では新しい行が無効であるため ( を使用してエスケープする必要があります\n)、それらの前後の空白を安全に削除できるからです。

于 2012-08-29T08:35:59.047 に答える