2012-09-21 53 views
10

我想從org.json移動到org.codehaus.jackson。如何轉換以下Java代碼?從org.json JSONObject到org.codehaus.jackson

private JSONObject myJsonMessage(String message){ 
    JSONObject obj = new JSONObject(); 
    obj.put("message",message); 
    return obj; 
} 

爲了簡單起見,我省去了try-catch塊。

回答

19

代替JSONObject使用傑克遜的ObjectMapperObjectNode

ObjectMapper mapper = new ObjectMapper(); 
ObjectNode node = mapper.createObjectNode(); 
node.put("message", "text"); 

這將是傑克遜的相當於當前的org.json代碼。

但是,傑克遜真正擅長的地方在於它能夠在您的Java類(POJO)和它們的JSON表示之間進行復雜的映射,以及它的流式API,它允許您進行真正的快速序列化,至少與org.json的同行。

+0

那麼'jacksonObj'會成爲我的返回對象嗎? – kasavbere

+0

隨着所有關於傑克遜的炒作,我都希望org.codehaus.jackson比org.json更簡單。爲您的幫助投票。 – kasavbere

+0

@kasavbere:我編輯了我的答案,以更好地反映您的原始問題。至於簡單性,這不是那麼簡單,但它取決於你想要用它做什麼。對於簡單的序列化,使用'org.json'更簡單。但是,如果您正在執行大對象序列化,並且有一些自定義需求(例如,將'Date'字段序列化爲'String'值),那麼傑克遜是迄今爲止最好的選擇。 –

5

Jackson api中沒有JSONObject。您可以返回一個Map或者一個Java Bean,而不是返回一個JSONObject,而是使用具有getter和setter的消息屬性。

public class MyMessage { 
    private String message; 

    public void setMessage(final String message) { 
     this.message = message; 
    } 

    public String getMessage() { 
     return this.message; 
    } 
} 

所以,你的方法將被簡化爲:

private MyMessage(String message) { 
    MyMessage myMessage = new MyMessage(); 
    myMessage.setMessage(message); 
    return myMessage; 
} 

這種變化的另一個方面是改變序列化代碼,以MyMessage轉換回JSON字符串。傑克遜做Java組件,地圖默認情況下,你並不需要創建一個JSONObject例如,

private String serializeMessage(MyMessage message){ 

    //Note: you probably want to put it in a global converter and share the object mapper 
    ObjectMapper mapper = new ObjectMapper(); 
    return mapper.writeValueAsString(message); 
} 

以上將返回{message: "some message"}

我跳過了異常的簡潔。

+0

隨着所有關於傑克遜的炒作,我都希望org.codehaus.jackson比org.json更簡單。爲您的幫助投票。 – kasavbere

+0

正如前面所提到的那樣,有相當的對象:無論是'JsonNode'(基本類型)還是'ObjectNode'(作爲特定的JSON對象子類型)。與org.json不同的是,有適當的OO訪問的節點繼承。 – StaxMan

1

如果您想從org.json庫升級到Jackson,並且初始保留相同的API,您可能需要閱讀「Upgrade from org.json to Jackson」。 這將至少使您的代碼的基本JSON讀取和寫入速度提高3倍;加上你可以 - 如果你願意選擇 - 開始轉換處理,因爲傑克遜可以很容易地在樹和POJOs之間轉換(ObjectMapper.treeToValue(...)valueToTreeconvertValue之間POJOs等)。

請記住,您熟悉的工具可能會將您的思維偏向某些模式,保持開放的心態可以幫助您找到更好的模式。 在傑克遜(或GSON或其他成熟的Java JSON工具)的情況下,您應該考慮適當的數據綁定可以提供哪些幫助,而不是使用以JSON爲中心的樹模型(即org.json提供的)。樹模型讓你的思維接近JSON結構,這有時是有用的;但也可能會阻止您看到更多的自然模式,這些模式來自定義POJO結構以反映預期的JSON,並直接在Java對象上運行。