当前位置: 首页 > 面试题库 >

使用Jackson向Java Mongo DBObject进行有效的POJO映射

施阎宝
2023-03-14
问题内容

尽管类似于使用MongoDBJava驱动程序将DBObject转换为POJO,但我的问题有所不同,因为我对使用Jackson进行映射 特别
感兴趣。

我有一个要转换为Mongo DBObject实例的对象。我想使用Jackson JSON框架来完成这项工作。

一种方法是:

DBObject dbo = (DBObject)JSON.parse(m_objectMapper.writeValueAsString(entity));

但是,根据https://github.com/FasterXML/jackson-docs/wiki/Presentation:-Jackson-
Performance,
这是最糟糕的方法。因此,我正在寻找替代方案。理想情况下,我希望能够连接到JSON生成管道并动态填充DBObject实例。这是可能的,因为在我的案例中,目标是一个BasicDBObject实例,该实例实现了Map接口。因此,它应易于装入管道中。

现在,我知道我可以使用ObjectMapper.convertValue函数将对象转换为Map
,然后BasicDBObject使用该BasicDBObject类型的map构造函数将地图递归转换为实例。但是,我想知道是否可以消除中间图并BasicDBObject直接创建直接图。

注意,因为a BasicDBObject本质上是一个映射,所以相反的转换(即从标量DBObject转换为POJO)是微不足道的,并且应该非常有效:

DBObject dbo = getDBO();
Class clazz = getObjectClass();
Object pojo = m_objectMapper.convertValue(dbo, clazz);

最后,我的POJO没有任何JSON注释,我希望它保持这种方式。


问题答案:

您可能可以使用Mixin批注来注释POJO和BasicDBObject(或DBObject),因此批注不是问题。由于BasicDBOject是地图,因此可以@JsonAnySetter在put方法上使用。

m_objectMapper.addMixInAnnotations(YourMixIn.class, BasicDBObject.class);

public interface YourMixIn.class {
    @JsonAnySetter
    void put(String key, Object value);
}

由于对MongoDB Object零经验,这就是我能想到的一切。

更新:
MixIn本质上是一种杰克逊机制,用于在不修改所述类的情况下向类添加注释。当您无法控制要编组的类时(例如当它来自外部jar时),或者当您不想使用注释使类混乱时,这是一个完美的选择。

在这里,您说的是BasicDBObject实现Map接口,因此该类具有putmap接口定义的method
。通过向该方法添加@JsonAnySetter,您可以告诉Jackson,当他自省了使用该方法将属性插入对象的类后,只要发现不知道的属性。关键是属性的名称,值是属性的值。

所有这些加在一起使得中间映射消失了,因为Jackson现在将直接转换为,BasicDBOject因为它现在知道如何从Json反序列化该类。使用该配置,您可以执行以下操作:

DBObject dbo = m_objectMapper.convertValue(pojo, BasicDBObject.class);

请注意,由于我不使用MongoDB,因此尚未进行测试,因此可能会有一些松散的结局。但是,对于相似的用例,我使用了相同的机制,没有任何问题。YMMV取决于类。



 类似资料:
  • 我试图通过jackson将以下json映射到pojo。我让第一部分工作(直到第节)。然而,第二部分我不确定如何将“section1”映射到这里可能包含的pojo或最佳实践? Json通过Rest电话收到: 波乔:

  • 我正在使用Jersey Web services(2.23),并将POJO映射用于JSON到对象的映射(Jersey-media-moxy)。我创建了一个类,如下所示: 我希望该对象的实例具有以下结构:

  • 我和jackson一起绘制地图,我有点迷茫。我的Json具有以下结构 我确实找到了很多处理数组的教程,但我在第一个标记“d”时就已经失败了。而且根本不需要所有的“_元数据”标记。 我创建了一个包含lastName等属性和一个集合附件的pojo。但我的代码在标记“d”或“_元数据”时总是失败 还有杰克逊的读者 任何提示都将不胜感激。 问候马蒂亚斯

  • JSONMappingException:无法反序列化com.demo.json.model.abc实例 编辑:我的POJO如下所示: 有人能提出解决办法吗? 有人能帮我做这个吗?

  • 如何使用杰克逊序列化此类 Jackson没有拾取@XmlElementWrapper@XmlSee还有注释,Jackson也没有映射@XmlRootElement注释。我使用的是Jackson 1.9.0。Jackson正在将元素放入列表中,但没有映射POJO类的根元素。 这里是示例方法。 它生成的响应是'{“response”:{“status”:0,“PBBeans”:[{“user_name

  • 我有一个JSON字符串: ...我试图映射回POJO: 上面的字符串(我正在尝试映射)实际上包含在一个组织中。json。JSONObject,可以通过调用该对象的方法来获取。 我想使用Jackson JSON对象/JSON映射框架来进行此映射,到目前为止,这是我最好的尝试: 我需要地图绘制者: 完全忽略外部的花括号(“”和“”) 如果唯一的方法是调用的方法,那么就这样吧。但我想知道Jackson是