2013-07-12 58 views
97

現在我有一個org.fasterxml.jackson.databind.ObjectMapper的實例,並希望得到一個String漂亮的JSON。我的Google搜索的所有結果都提供了Jackson 1.x的方法,我似乎無法找到在2.2中做到這一點的適當的,不被棄用的方式。雖然我不相信代碼是這個問題絕對必要的,這就是我現在所擁有的:從傑克遜2.2的ObjectMapper漂亮的印刷JSON

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 

回答

196

你可以通過你的ObjectMapper像這樣設置SerializationFeature.INDENT_OUTPUT使漂亮印刷:

mapper.enable(SerializationFeature.INDENT_OUTPUT); 
+0

我也試過這個,但似乎'SerializationConfig'已解析但'SerializationConfig.Feature'不是。這似乎是漂亮打印的另一種方法,除非我錯過了某些東西,否則它也會被棄用。有一個'Feature'類自己分離出來,但裏面沒有'INDENT_OUTPUT'常量。 !:( –

+0

@Anthony阿特金森 - 我編輯的Jackson2答案 – gregwhitaker

+0

優秀我很想知道你是怎麼發現;) –

29

mkyong,神奇的咒語是defaultPrintingWriterpretty print JSON

較新的版本:

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

舊版本:

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

似乎我很快就跳了一下槍。你可以嘗試gson,其constructor supports pretty-printing

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

希望這有助於...

+0

我發現這篇文章,卻失望地發現,這是很印刷的那些過時的方法之一。在'ObjectMapper'類中'defaultPrettyPrintingWriter()'不再可用(甚至作爲不推薦的方法)。 –

+0

我實際上正在考慮這樣做,但我的應用程序已經非常重視面向Jackson的功能,並且所有功能都已完成。這將被託管的Web應用程序服務器已經被嚴重徵稅,並且我不想僅僅爲了記錄請求和響應而加載額外的庫。不過,我肯定會爲你的答案投票。 –

+5

@AnthonyAtkinson在傑克遜2.3有一個方法'ObjectMapper.writerWithDefaultPrettyPrinter()' –

-7

試試這個。

objectMapper.enable(SerializationConfig.Feature.INDENT_OUTPUT); 
+9

複製所選擇的答案是不是真的有幫助。 –

+1

實力很有幫助,因爲我在一行中提到的一些人,我覺得分享不管我是誰知道好。 –

2

的IDENT_OUTPUT並沒有爲我做任何事,並給予與我的傑克遜2.2.3罐工作一個完整的答案:

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) 
22

傑克遜API已經改變:

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

它仍然可能(與傑克遜2.7.6)使用'新ObjectMapper()配置(SerializationFeature.INDENT_OUTPUT,真).writer()writeValueAsString(新的HashMap <字符串,對象>());'。您只需確保使用從配置的ObjectMapper獲得的作者。 – Martin

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>