将Java中的LinkedHashMap<String,String>转换为对象

4
我会直接回答你的问题,稍后我会提供更多背景信息。
简单来说:我有一个LinkedHashMap表示特定对象,最好的方法是将其转换为该对象?我知道可以使用泛型遍历所有元素并设置字段,但嵌套对象怎么办?
背景:我有一个JAX-RS服务,用于消耗JSON对象。我的服务处理不同类型的对象,只是表示一个接口。因此,我不知道哪些对象来自外部,哪个程序正在使用我的服务。在运行时,通过@Inject在我的接口上获取信息。JAX-RS服务将客户端的数据存储在未分类的对象中,并自动完成(这就是LinkedHashMap)。
使用我的接口,我想提供一个名为setObject的方法,参数应该是该类型的对象。我可以处理所有这些内容,但无法将LinkedHashMap对象转换为特定对象。
示例结构: 目标对象可能如下所示:
public class Document {
    private String title;
    private String id;
    private int version;
}

LinkedHashMap看起来像这样

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

1
你是否在谷歌上搜索过一个库,以帮助将JSON转换为Java对象?你肯定不是唯一想要这样做的人。 - Duncan Jones
为什么你不能直接使用 HashMap 呢? - mercutio
使用HashMap的好处是什么?@mercutio - Tobias Sarnow
@DuncanJones 我的问题是我已经将JSON转换为Java,这是在JAX-RS中自动完成的。但是在检索信息的时候,我对后面的对象没有任何信息。因此,拥有一个代表这个LinkedHashmap的对象是可以的。 - Tobias Sarnow
convertValue 对我有效。 - Gaurav
2个回答

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; 
}  

使用Jackson将对象转换为JSON

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

谷歌 JSON

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

PS. 使用Google JSON,您可以从类中删除XML注释。


我也考虑使用与JAX-RS相同的方法进行反向编组。我非常喜欢Gson,但对于我的情况,我希望有一种JAX-RS标准方式,这样在应用服务器上就可以使用jackson或任何其他JAX-RS实现。有没有办法实现这个? - Tobias Sarnow
我现在正在使用Gson,但我仍然期待一种不依赖于库的方式。 - Tobias Sarnow

1

反射是设置泛型未知对象属性的唯一方法。
您可以在文档中找到所需的一切。


嗯,好的,但我如何以高效的方式处理嵌套对象? - Tobias Sarnow
反射并不是为了性能而设计的。你可以尝试在setObject方法中缓存对象(类)变量->方法映射,这将消除每次迭代对象的属性/方法的需要,但仍然会相对较慢。关于动态方法调用,你无法做任何事情 - 它很慢 - Germann Arlington
你知道是否有任何库可以帮助我设置对象吗? - Tobias Sarnow
从我的角度来看 - 尝试查看JAXB(https://www.google.co.uk/search?q=java+jaxb) - Germann Arlington
1
我尝试了反射,最终使用 Gson 来映射我的对象。处理嵌套对象可能会很麻烦... - Tobias Sarnow

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接