2016-09-17 201 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完成,非常简单... –

相关问题