2012-09-26 26 views
3

我正在編寫一個JSON-RS Web服務,它將JSON返回給客戶端,並且我正在嘗試使用org.codehaus.jackson庫來處理JSON對象。我遇到的問題是我的JsonNode在返回給客戶端之前未正確序列化。響應中有一堆無關的屬性。我想要返回JsonNode的最簡單的JSON表示。JAX-RS的傑克遜的JsonNode

這裏的(人爲)例如:

@GET 
@Path("user") 
@Produces(MediaType.APPLICATION_JSON) 
public JsonNode getUser() { 
    ObjectNode node = JsonNodeFactory.instance.objectNode(); 
    node.put("user", "jDoe"); 
    return node; 
} 

從這個JSON響應是相當難看:

{"object":true,"elements":[{"textual":true,"textValue":"jDoe","binaryValue":"jDoe","valueAsText":"jDoe","valueNode":true,"containerNode":false,"missingNode":false,"array":false,"object":false,"pojo":false,"number":false,"integralNumber":false,"floatingPointNumber":false,"int":false,"long":false,"double":false,"bigDecimal":false,"bigInteger":false,"boolean":false,"null":false,"binary":false,"booleanValue":false,"intValue":0,"longValue":0,"doubleValue":0.0,"decimalValue":0,"bigIntegerValue":0,"valueAsInt":0,"valueAsLong":0,"valueAsDouble":0.0,"valueAsBoolean":false,"elements":[],"fieldNames":[],"fields":[]}],"fieldNames":["user"],"fields":[{"key":"user","value":{"textual":true,"textValue":"jDoe","binaryValue":"jDoe","valueAsText":"jDoe","valueNode":true,"containerNode":false,"missingNode":false,"array":false,"object":false,"pojo":false,"number":false,"integralNumber":false,"floatingPointNumber":false,"int":false,"long":false,"double":false,"bigDecimal":false,"bigInteger":false,"boolean":false,"null":false,"binary":false,"booleanValue":false,"intValue":0,"longValue":0,"doubleValue":0.0,"decimalValue":0,"bigIntegerValue":0,"valueAsInt":0,"valueAsLong":0,"valueAsDouble":0.0,"valueAsBoolean":false,"elements":[],"fieldNames":[],"fields":[]}}],"containerNode":true,"valueNode":false,"missingNode":false,"array":false,"pojo":false,"number":false,"integralNumber":false,"floatingPointNumber":false,"int":false,"long":false,"double":false,"bigDecimal":false,"bigInteger":false,"textual":false,"boolean":false,"null":false,"binary":false,"booleanValue":false,"intValue":0,"longValue":0,"doubleValue":0.0,"decimalValue":0,"bigIntegerValue":0,"valueAsInt":0,"valueAsLong":0,"valueAsDouble":0.0,"valueAsBoolean":false} 

我寧願它是簡單地

{"user":"jDoe"} 

上午我遺漏了什麼?我不明白爲什麼會出現序列化JSON到JSON的簡單JsonNode問題。

從JSON4J庫中返回一個JSONObject可以像預期的那樣工作,但我更喜歡使用Jackson的庫。

回答

3

這應該是原樣,所以我懷疑可能是版本不兼容。 由於Jersey使用Jackson 1.x(1.8或1.9),因此您需要使用相同的版本; 2.0類使用不同的Java包,以允許1.x和2.x共存(以避免強制升級)。

因此,請確保您使用的是與澤西島相同的版本。

+0

我找到了這個答案,因爲我有同樣的問題,但是 - 我一直使用傑克遜版本2.4.5 + jersey-media-json-jackson-2.17(這是不同的項目,所有其他球衣庫都是2.17)。它仍然返回「醜陋的」JSON而不是真正的內容。有趣的是,如果我把這個'List result'並且以這種方式返回,而不是'javax.ws.rs.core.Response.ok(result).build()'(即'Result'返回類型)沒問題。在我使用自定義JSON對象的其他地方,返回的實體直接工作得很好。 – virgo47

+0

@ virgo47我認爲這個領域存在微妙的錯誤,實際上,無論是否由JAX-RS提供者強制確定類型。因此,請儘可能使用最新的補丁(2.4.6或2.5.3)。我同意它應該可以正常工作,但是與JAX-RS的集成很難完全正確,尤其是,由於Java類型擦除。 – StaxMan

+0

呃,不知道我是如何找到2.4.5作爲最新的版本的 - 好消息是在切換到2.5.3(+明確地向POM添加了一些傑克遜核心依賴關係,這些依賴關係在舊版本中以傳遞方式出現;-))按預期工作。謝謝! – virgo47