2016-08-31 25 views
0

當我將ObjectNode序列化回字符串時,遇到了排除Null/Empty屬性的問題。我搜索了一下,關於的所有引用JSONInclude.Include.NON_NULL是關於從一個Bean,而不是一個ObjectNode的序列化和反序列化 - 它認爲序列化與「任意」ObjectNode的行爲不同,而不是一個預定義的Bean。Jackson ObjectNode:如何在序列化中不包含NULL

我的目標是讓輸出= { 「名」: 「MYNAME」},不{ 「名」: 「MYNAME」, 「女媧」:空, 「搶先」: 「」}

import com.fasterxml.jackson.annotation.JsonInclude 
import com.fasterxml.jackson.databind.node.ObjectNode 
import com.fasterxml.jackson.databind.ObjectMapper 

val jsonInputStr = """{"name": "myName"}""" 
val newObjMapper = new ObjectMapper().setSerializationInclusion(JsonInclude.Include.NON_EMPTY) 

val json = newObjMapper.readTree(jsonInputStr).asInstanceOf[ObjectNode] 
json.put("nu", null.asInstanceOf[String]) 
json.put("empt", "") 
val str = newObjMapper.writeValueAsBytes(json) 
println(s"OUTPUT = ${new String(str)}") 

打印: OUTPUT = { 「名」: 「MYNAME」, 「女媧」:空, 「搶先」: 「」}

回答

0

如果反序列化JSON成Map代替JsonNode結構,當你重新序列化Map時,它會服從序列化包含n個參數。

編輯處理意見:

如果你想使用節點結構,不介意做多系列化步驟略有性能損失,那麼你總是做這樣的事情:

val rootNode = objectMapper.readTree(...) 
... 
val map = objectMapper.treeToValue(rootNode, Map::class) 
val json = objectMapper.writeValueAsString(map) 
+0

一個大的嵌套地圖(我的實際Json對象與很多不同類型嵌套)?呸。真的希望這個功能可以在ObjectNode或JsonNode上工作,這只是我的語法錯誤。他們已經明確地將它添加到Beans中,並且objectMapper逐個遍歷整個樹節點,應該很容易讓它們提供該功能。 ......似乎沒有多少人使用可變的ObjectNode。 –

+0

我編輯了我的答案,提供了一個解決方案,使您可以在節點上執行您的域邏輯(儘管這種醜陋的序列化)。 –