标签: mongo-jackson-mapper

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

虽然类似于使用MongoDB Java驱动程序将DBObject转换为POJO,但我的问题不同,因为我特别感兴趣使用Jackson进行映射.

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

一种方法是:

DBObject dbo = (DBObject)JSON.parse(m_objectMapper.writeValueAsString(entity));
Run Code Online (Sandbox Code Playgroud)

然而,根据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);
Run Code Online (Sandbox Code Playgroud)

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

java mongodb jackson mongo-jackson-mapper

19
推荐指数
1
解决办法
4万
查看次数

用Jackson以两种不同的方式序列化一个班级

在我们的一个项目中,我们使用java webapp与MongoDB实例进行通信.在数据库中,我们DBRefs用来跟踪一些对象关系.我们使用jackson(使用mongodb-jackson-mapper)使用POJO对象进行序列化.

但是,我们使用相同的POJO然后(de)序列化到外部世界,我们的前端处理呈现JSON.

现在,我们需要一种方法,让外部世界的序列化包含来自a的引用对象DBRef(以便UI可以呈现完整对象),而我们显然希望将数据DBRef写入数据库,而不是整个对象.

现在我写了一些未经测试的静态嵌套类代码:

public static class FooReference {
    public DBRef<Foo> foo;

    // FIXME how to ensure that this doesn't go into the database?
    public Foo getFoo() {
        return foo.fetch();
    }
}
Run Code Online (Sandbox Code Playgroud)

理想情况下,我想要一种方法来注释这个,以便我可以(或)使用或不使用getFoo()结果序列化它,可能取决于一些配置对象.这可能吗?你有没有看到更好的方法来做这件事?

java pojo mongodb jackson mongo-jackson-mapper

6
推荐指数
1
解决办法
6320
查看次数

杰克逊 - 用根对象包装对象列表

我的Controller返回一个MyObj对象列表(使用@ResponseBody)

public MyObj 
{
   int a;
   int b;
}
Run Code Online (Sandbox Code Playgroud)

返回JSON如下所示:

[{"a":1,"b":2},{"a":2,"b":2}]
Run Code Online (Sandbox Code Playgroud)

我想包装这个JSON,所以它将返回如下内容:

{ "data": [{"a":1,"b":2},{"a":2,"b":2}]}
Run Code Online (Sandbox Code Playgroud)

从我读到的我需要启用SerializationConfig.Feature.WRAP_ROOT_VALUE或(?)在我的控制器上使用@JsonRootName("data").

还尝试了@XmlRootElement,似乎没什么用.知道用根名称包装对象列表的正确方法是什么?

java jackson object-object-mapping mongo-jackson-mapper

6
推荐指数
1
解决办法
4145
查看次数

@JsonProperty(access = JsonProperty.Access.WRITE_ONLY)不起作用

在对类DataType进行序列化时,忽略了dbOptions,但正在使用其值打印dataType.

注意我只需要在序列化期间忽略这些属性而不是反序列化.

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.EXTERNAL_PROPERTY, property = "dataType")
@JsonSubTypes(value = {
    @JsonSubTypes.Type(value = DefaultType.class, name = "Default"),
    @JsonSubTypes.Type(value = NumberRangeType.class, name = "NumberRange"),

})
public abstract class DataType {

@JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
protected String dataType;

@JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
protected String dbOptions;

public String getDataType() {
    return dataType;
}

public void setDataType(String dataType) {
    this.dataType = dataType;
}

public String getDbOptions() {
    return dbOptions;
}

public void setDbOptions(String dbOptions) {
    this.dbOptions = dbOptions;
}


abstract
public void compute() …
Run Code Online (Sandbox Code Playgroud)

java serialization jackson mongo-jackson-mapper

6
推荐指数
1
解决办法
7531
查看次数

如何在 Jackson 中反序列化嵌套的包装字符串?

我有一个 JSON 字符串,其中包含嵌套和包装的 JSON 字符串。我想使用杰克逊反序列化它,但我不确定如何。这是一个示例 bean:

@JsonIgnoreProperties(ignoreUnknown = true)
public class SomePerson {

    public final String ssn;
    public final String birthday;
    public final Address address;

    @JsonCreator
    public SomePerson(
            @JsonProperty("ssn") String ssn,
            @JsonProperty("birthday") String birthday,
            @JsonProperty("data") Address address,
            @JsonProperty("related") List<String> related) {
        this.ssn = ssn;
        this.birthday = birthday;
        this.address = address;
    }

    @JsonIgnoreProperties(ignoreUnknown = true)
    public static class Address {

        public final String city;
        public final String country;

        @JsonCreator
        public Address(
                @JsonProperty("city") String city,
                @JsonProperty("country") String country) {
            this.city = city; …
Run Code Online (Sandbox Code Playgroud)

java jackson mongo-jackson-mapper jackson2

6
推荐指数
1
解决办法
2002
查看次数

Jackson JSON反序列化MongoDB ObjectId

好的,首先,这是从我的Web服务返回的JSON.我试图在Android ContentProvider中的ResponseHandler中进行异步查询后将其反序列化为pojos.

{"exampleList" : [{
"locationId" : "00001" , 
"owners" : [ 
  { 
    "paidID" : { "$oid" : "50a9c951300493f64fbffdb6"} , 
    "userID" : { "$oid" : "50a9c951300493f64fbffdb6"}
  } , 
  { 
    "paidID" : { "$oid" : "50a9c951300493f64fbffdb7"} , 
    "userID" : { "$oid" : "50a9c951300493f64fbffdb7"}
  } 
]
}]}
Run Code Online (Sandbox Code Playgroud)

起初,我对我看到的问题感到困惑,因为我在我的Android应用程序中使用与我的Web服务相同的Jackson注释bean - 但后来我意识到该owners对象永远不会在示例JSON中发送到我的Web服务(它跳过我的Web服务上的POJO并通过DAO的原子更新添加到mongoDB中的文档中).

那么好吧.到目前为止,杰克逊不必处理这个owners对象,现在它正在窒息,即:

JsonMappingException:无法反序列化的情况下java.lang.String进行的 START_OBJECT,在[字符位置,你可以找到令牌"userID",并"paidID"通过参考链] [路径到我的杰克逊豆含有车主类]

我的Jackson bean有一个包装器,这就是"exampleList"的全部内容:

public class Examples extends HashMap<String, ArrayList<Example>> {

}
Run Code Online (Sandbox Code Playgroud)

然后是实际的Example课程:

@JsonIgnoreProperties(ignoreUnknown = true) …
Run Code Online (Sandbox Code Playgroud)

json jackson mongo-jackson-mapper

4
推荐指数
3
解决办法
2万
查看次数

使用 Jackson XML Mapper 获取列表

我目前正在与 Jackson 合作从在线位置读取 XML 文件,将其映射到一个对象,然后使用对象映射器将该对象插入到 MongoDB 中。

目前我的数据集看起来像这样:

<sensors>
    <sensor id="000" name="Sensor Name" refreshRate="2000">
        <location latitude="12.3456" longitude="-67.890"/>
    </sensor>
<sensor id="000" name="Sensor Name" refreshRate="2000">
        <location latitude="12.3456" longitude="-67.890"/>
    </sensor>
</sensors>
Run Code Online (Sandbox Code Playgroud)

如果我执行以下操作:

列表条目 = xmlMapper.readValue(conn.getInputStream(), List.class);

我得到一个包含项目的 LinkedHashMap 列表。但是,如果我可以将它映射回我已经创建的传感器类,我会更喜欢。

这个传感器类是我在与 Mongo 交互时使用的类,它看起来像这样:

@Document(collection = "Sensor")
@JsonIgnoreProperties(ignoreUnknown = true)
@JacksonXmlRootElement(localName="sensors")
public class Sensor {

    @Id
    private int id;

    String name = "";
    long refreshRate = "";
    Location location;

    ...
}
Run Code Online (Sandbox Code Playgroud)

我试过投射或映射到传感器;但是,这不起作用。缺少的步骤是什么?我阅读的所有文档和教程似乎只处理单个条目的简单实例。

java json mongodb mongo-jackson-mapper

3
推荐指数
1
解决办法
7810
查看次数

Jackson ObjectMapper忽略所有没有注释的属性

我的目标是将jsonObject转换为Class。我只想添加在Class中注释的字段。示例:json对象包含50个字段。类有4个字段。我只想映射确切的4个字段,而不在类中添加46个附加忽略。

JSON:

{
  "id": "1",
  "name": "John",
  "Address": "Some Address 7009",
}
Run Code Online (Sandbox Code Playgroud)

类:

public static class User {
    Integer id;
    String name;

    public User (@JsonProperty("id")Integer id, @JsonProperty("name")String name {
            this.id= id;
            this.name= name;
    }
    ....
}
Run Code Online (Sandbox Code Playgroud)

用户类别没有地址字段。我的目标是排除它,因为它没有注释。

java json jackson mongo-jackson-mapper

3
推荐指数
1
解决办法
3417
查看次数