web-dev-qa-db-ja.com

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

現在、org.fasterxml.jackson.databind.ObjectMapperのインスタンスがあり、きれいなJSONでStringを取得したいと思います。私の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
126

以下のようにObjectMapperSerializationFeature.INDENT_OUTPUTを設定することで、きれいな印刷を有効にできます。

mapper.enable(SerializationFeature.INDENT_OUTPUT);
248
gregwhitaker

mkyong によると、魔法の呪文はdefaultPrintingWriterから pretty print JSON までです。

新しいバージョン:

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

古いバージョン:

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

私はすぐに銃を少し跳んだようです。 gson を試すことができます constructorはpretty-printingをサポートします

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

お役に立てれば...

44
hd1

Jackson APIが変更されました:

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

iDENT_OUTPUTは私のために何もしませんでした、そして私のジャクソン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 ) );
}
3
Stan Towianski

スプリングとジャクソンの組み合わせを使用している場合、次のようにできます。提案どおり@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
MohanaRao SV

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

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