2016-09-17 142 views
2

我的用例是將任意POJO轉換爲Map,然後從Map轉換回POJO。所以我最終使用策略POJO - > json - > org.bson.Document並返回到org.bson.Document - > json - > POJO。如何在Java中將POJO轉換爲Map,反之亦然?

我使用GSON到POJO轉換成JSON,

Gson gson = new GsonBuilder().create(); 
String json = gson.toJson(pojo); 

然後

Document doc = Document.parse(json); 

創建文檔,很容易。但其他解決方法是有問題的。 document.toJson()沒有給長的標準json,timestamp等,而gson在對POJO進行反串行化時抱怨。所以我需要一種將org.bson.Document轉換爲標準json的方法。

注意:我想避免使用mongo java驅動程序或morphia,因爲此工作與mongo無關。

+1

「標準json for timestamp」是什麼意思? JSON標準沒有說明時間戳是如何編碼的。 – yole

+0

文檔生成json只要{「$ numberLong」:1245}不能被gson解析。通過標準的json,我想表示json就像{「abc」:1245},它可以被反序列化爲字段名稱abc。 –

+0

定義*標準json *的含義,因爲你所說的大部分內容都不準確。 Timestamp沒有*標準*格式,或任何其他非原始字符串,數字,布爾值或空值的對象的任何其他字符串表示形式。 –

回答

12

我的用例是將任意POJO轉換爲Map,然後從Map轉換回POJO。

你可以使用傑克遜,一個Java的流行JSON解析器:

ObjectMapper mapper = new ObjectMapper(); 

// Convert POJO to Map 
Map<String, Object> map = 
    mapper.convertValue(foo, new TypeReference<Map<String, Object>>() {}); 

// Convert Map to POJO 
Foo anotherFoo = mapper.convertValue(map, Foo.class); 

據傑克遜的文件,這種方法在功能上類似於第一序列化給定值轉換成JSON,然後綁定JSON數據轉換成給定類型的值,但應該更高效,因爲完全序列化不需要(需要)。但是,對於數據綁定,將使用相同的轉換器(序列化器和反序列化器),這意味着相同的對象映射器配置工作。

+1

感謝您的指針。從來不知道它可以通過ObjectMapper完成,非常簡單... –

相關問題