156

現在、私は のインスタンスを持っており、きれいな JSONorg.fasterxml.jackson.databind.ObjectMapperを取得したいと考えています。StringGoogle 検索のすべての結果は、これを行う 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
4

8 に答える 8

297

を好きなように設定することで、きれいな印刷を有効にすることができSerializationFeature.INDENT_OUTPUTます:ObjectMapper

mapper.enable(SerializationFeature.INDENT_OUTPUT);
于 2013-07-12T14:59:53.473 に答える
48

mkyongによると、魔法の呪文はJSONdefaultPrintingWriterを整形することです:

新しいバージョン:

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

古いバージョン:

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

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

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

お役に立てれば...

于 2013-07-12T14:38:21.377 に答える
37

The jackson API has changed:

new ObjectMapper()
.writer()
.withDefaultPrettyPrinter()
.writeValueAsString(new HashMap<String, Object>());
于 2015-05-23T09:41:54.457 に答える
3

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 ) );
}
于 2015-03-18T17:28:02.727 に答える
0

プロセス内のすべての ObjectMapper インスタンスに対してデフォルトでこれをオンにしたい場合は、INDENT_OUTPUT のデフォルト値を true に設定するちょっとしたハックがあります。

val indentOutput = SerializationFeature.INDENT_OUTPUT
val defaultStateField = indentOutput.getClass.getDeclaredField("_defaultState")
defaultStateField.setAccessible(true)
defaultStateField.set(indentOutput, true)
于 2015-04-10T02:17:12.643 に答える