2012-08-24 139 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

你知道有没有图书馆可以帮助我设置对象吗? –

相关问题