web-dev-qa-db-ja.com

きれいに印刷されたJSONコードのコンパクトな形式を取得するにはどうすればよいですか?

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

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

これに:

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

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

22
mtyurt

ジャクソンを使用すると、JSON文字列から読み取ることができるため、きれいに出力された文字列を読み取ってジャクソンに戻し、きれいな出力を無効にして再度出力します。

文字列から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>
21
Brad

ストリーミング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());
5
Miles

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

次のパターンを使用すると、正規表現の使用も機能します:\s*\n\s*

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

3
Aaron Digulla

Jackosn-core は1つの解決方法ですが、私はorg.jsonこれは非常にシンプルですが、Java用の標準jsonライブラリです。ここにオープンソースコード-> stleary/JSON-Java

Maven deps

<dependency>
    <groupId>org.json</groupId>
    <artifactId>json</artifactId>
    <version>20160810</version>
</dependency>

使用法

        String payload = "{\n" +
            "  \"fact1\": \"Java is verbose.\", \n" +
            "  \"fact2\" : \"C has pointers\"\n" +
            "}";
        System.out.println(new JSONObject(payload));

コンパクトなjsonを取得します{"fact2":"C has pointers","fact1":"Java is verbose."}を1行で入力します。

1
prayagupd