2012-08-24 134 views
4

我將直接從我的問題開始,稍後我會提供更多背景信息。將LinkedHashMap <String,String>轉換爲Java中的對象

簡單:我有一個LinkedHashMap<String, String>它代表一個特定的對象。 將其轉換爲該對象的最佳方式是什麼?

我知道您可以使用泛型來獲取所有元素並設置字段,但什麼是嵌套對象?

背景:我有一個使用JSON對象的JAX-RS服務。我的服務處理不同類型的對象,只是表示一個接口。所以我不知道哪些對象來自外部,哪些程序正在使用我的服務。

在運行時,我通過我的界面上的@Inject獲取信息。 JAX-RS服務將來自客戶端的數據存儲在無類型的對象中並自動完成(即LinkedHashMap<String, String>)。

隨着我的界面我想提供一個像setObject和參數應該是該類型的對象的方法。我可以處理所有這些,但不是將對象LinkedHashMap<String, String>轉換爲該特定對象的部分。

示例結構: 的目標對象可能喜歡

public class Document { 
    private String title; 
    private String id; 
    private int version; 
} 

LinkedHashMap看起來像

{title=some title, id=1, version=1} 
+0

爲什麼不能直接使用'HashMap'呢? – mercutio

+1

您是否使用過Google庫來協助將JSON轉換爲Java對象?你不能一個人想要這樣做。 –

+0

使用HashMap有什麼好處@mercutio –

回答

3

您可以創建兩個類

@XmlAccessorType(XmlAccessType.FIELD) 
public class Document { 
    @XmlElement 
    private String title; 
    @XmlElement 
    private String id; 
    @XmlElement 
    private int version; 
} 


@XmlAccessorType(XmlAccessType.FIELD) 
public class MapJson { 
    @XmlElement 
    private LinkedHashMap<String, String> documents; 
} 

和cobvert對象JSON usingg
傑克遜

new org.codehaus.jackson.map.ObjectMapper().writeValueAsString(instanceofMapJson); 

谷歌JSON

new com.google.gson.Gson().toJson(instanceofMapJson); 

PS。使用谷歌json,你可以從你的類中刪除xml註釋

+0

我也想過使用JAX-RS正在使用的相同方法執行反向編組。我非常喜歡Gson,但對於我的情況,我希望有一個JAX-RS標準方式,以便在應用服務器jackson或任何其他JAX-RS實現上使用。 有沒有辦法呢? –

+0

我現在正在使用Gson,但我仍然期待着不依賴庫的方式。 –

1

反思是用於設置通用的不明物體的性質的必由之路。
你可以在文檔中找到你需要的一切。

+0

嗯好吧,但我如何處理高性能的方式嵌套對象? –

+0

反射不是爲性能而設計的。你可以嘗試緩存對象的(類)變量 - >方法映射到你的(應用程序包含的)'setObject'方法中,它將消除每次遍歷對象的屬性/方法的需要,但它仍然會) 慢。關於動態方法調用沒有什麼可以做的 - 它**很慢**。 –

+0

你知道有沒有圖書館可以幫助我設置對象嗎? –

相關問題