Jackson 2.2のObjectMapperからのJSONのきれいな印刷


140

現在、私はのインスタンスがorg.fasterxml.jackson.databind.ObjectMapperありString、かなりのJSON を取得したいと考えています。私のGoogle検索の結果はすべて、Jackson 1.xでこれを行う方法を思いついたので、2.2でこれを行う非推奨ではない適切な方法を見つけることができないようです。この質問にはコードが絶対に必要だとは思いませんが、ここに私が今持っているものがあります:

ObjectMapper mapper = new ObjectMapper();
mapper.setSerializationInclusion(Include.NON_NULL);
System.out.println("\n\n----------REQUEST-----------");
StringWriter sw = new StringWriter();
mapper.writeValue(sw, jsonObject);
// Want pretty version of sw.toString() here

回答:


276

次のようにSerializationFeature.INDENT_OUTPUTonを設定することで、pretty-printingを有効にできますObjectMapper

mapper.enable(SerializationFeature.INDENT_OUTPUT);

1
私もこれを試しましたが、SerializationConfig解決されたようですが解決されていSerializationConfig.Featureません。これは、見栄えの良い印刷方法の1つであるように思われます。Feature独自に分離されているが、INDENT_OUTPUT内部に定数がないクラスがあります。:(
アンソニー・アトキンソン

優れた!私はあなたがそれをどのように見つけたのか知りたいです;)
アンソニー・アトキンソン

1
私は自分のプロジェクトの1つを調べましたが、それもここにあるようです:github.com/FasterXML/jackson-databindの[ Commonly used Features]
gregwhitaker

必要な関連インポートはimport com.fasterxml.jackson.databind。{SerializationFeature、ObjectMapper}
dgh

2
2.2.1では、これは私にとって必要なものでした:import org.codehaus.jackson.map.SerializationConfig.Feature; mapper.enable(Feature.INDENT_OUTPUT);
ハーシュウェア2013

46

mkyongによると、魔法の呪文はJSONdefaultPrintingWriterきれいに印刷することです:

新しいバージョン:

System.out.println(mapper.writerWithDefaultPrettyPrinter().writeValueAsString(jsonInstance));

古いバージョン:

System.out.println(mapper.defaultPrettyPrintingWriter().writeValueAsString(jsonInstance));

私は銃を少し早くジャンプしたようです。gsonを試すことができます。そのコンストラクターはpretty-printingをサポートしています

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

お役に立てれば...


1
私はこの記事を見つけ、これが非推奨のきれいな印刷方法の1つであることを知ってがっかりしました。defaultPrettyPrintingWriter()(廃止されたメソッドとしても)ObjectMapperクラスで利用できなくなりました。
アンソニーアトキンソン

私は実際にこれを行うことを考えていましたが、私のアプリケーションはすでに非常にジャクソン指向であり、すべての機能が実際に完了しています。これがホストされるWebアプリケーションサーバーは既にかなりの負荷がかかっており、リクエストと応答のログを記録するためだけに追加のライブラリをロードしたくありません。しかし、私は間違いなくあなたの答えに賛成票を投じます。
アンソニーアトキンソン

7
ジャクソン2.3の@AnthonyAtkinsonにはメソッドがありますObjectMapper.writerWithDefaultPrettyPrinter()
matt b

36

ジャクソンAPIが変更されました:

new ObjectMapper()
.writer()
.withDefaultPrettyPrinter()
.writeValueAsString(new HashMap<String, Object>());

3
(Jackson 2.7.6では)を使用することはまだ可能new ObjectMapper().configure(SerializationFeature.INDENT_OUTPUT, true).writer().writeValueAsString(new HashMap<String, Object>());です。設定されたから取得したライターを必ず使用する必要がありますObjectMapper
マーティン

3

IDENT_OUTPUTは私にとって何もしませんでした。そして、私のjackson 2.2.3 jarで動作する完全な答えを与えるために:

public static void main(String[] args) throws IOException {

byte[] jsonBytes = Files.readAllBytes(Paths.get("C:\\data\\testfiles\\single-line.json"));

ObjectMapper objectMapper = new ObjectMapper();

Object json = objectMapper.readValue( jsonBytes, Object.class );

System.out.println( objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString( json ) );
}

0

プロセス内のすべてのObjectMapperインスタンスに対してデフォルトでこれをオンにする場合は、INDENT_OUTPUTのデフォルト値をtrueに設定する小さなハックです。

val indentOutput = SerializationFeature.INDENT_OUTPUT
val defaultStateField = indentOutput.getClass.getDeclaredField("_defaultState")
defaultStateField.setAccessible(true)
defaultStateField.set(indentOutput, true)

0

スプリングとジャクソンの組み合わせを使用している場合は、次のように実行できます。私は@gregwhitakerを推奨どおりフォローしていますが、春のスタイルで実装しています。

<bean id="objectMapper" class="com.fasterxml.jackson.databind.ObjectMapper">
    <property name="dateFormat">
        <bean class="java.text.SimpleDateFormat">
            <constructor-arg value="yyyy-MM-dd" />
            <property name="lenient" value="false" />
        </bean>
    </property>
    <property name="serializationInclusion">
        <value type="com.fasterxml.jackson.annotation.JsonInclude.Include">
            NON_NULL
        </value>
    </property>
</bean>

<bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
    <property name="targetObject">
        <ref bean="objectMapper" />
    </property>
    <property name="targetMethod">
        <value>enable</value>
    </property>
    <property name="arguments">
        <value type="com.fasterxml.jackson.databind.SerializationFeature">
            INDENT_OUTPUT
        </value>
    </property>
</bean>

0

この質問を表示する他の人が(オブジェクトではなく)JSON文字列しか持っていない場合は、それをに入れてHashMapObjectMapper機能します。result変数は、あなたのJSON文字列です。

import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.HashMap;
import java.util.Map;

// Pretty-print the JSON result
try {
    ObjectMapper objectMapper = new ObjectMapper();
    Map<String, Object> response = objectMapper.readValue(result, HashMap.class);
    System.out.println(objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(response));
} catch (JsonParseException e) {
    e.printStackTrace();
} catch (JsonMappingException e) {
    e.printStackTrace();
} catch (IOException e) {
    e.printStackTrace();
} 

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.