虽然类似于使用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 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()结果序列化它,可能取决于一些配置对象.这可能吗?你有没有看到更好的方法来做这件事?
我的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,似乎没什么用.知道用根名称包装对象列表的正确方法是什么?
在对类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) 我有一个 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) 好的,首先,这是从我的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) 我目前正在与 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)
我试过投射或映射到传感器;但是,这不起作用。缺少的步骤是什么?我阅读的所有文档和教程似乎只处理单个条目的简单实例。
我的目标是将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)
用户类别没有地址字段。我的目标是排除它,因为它没有注释。