我得到了一个json,我将其序列化为mongodb basicdbobject并将其插入数据库:
String serialized = "";
try {
serialized = OBJECT_MAPPER.writeValueAsString(customEx.getOut().getBody());
} catch (JsonProcessingException e) {
e.printStackTrace();
}
collection.update(upsertQuery, BasicDBObject.parse(serialized), true, false);
在从数据库中读取dbobject时,我希望使用objectmappers的readvalue将其转换为pojo,并使用给定的类:
public static <T> T fromDB(DBObject o, Class<T> clazz) {
try {
return OBJECT_MAPPER.readValue(o.toString(), clazz);
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
我要将其转换为的类是从xsd sheme生成的,还包含时间戳/长值,如下所示:
@XmlRootElement(name = "ItemType")
public class ItemType {
@XmlSchemaType(name = "dateTime")
protected XMLGregorianCalendar date;
[...]
然而,对于旧的Java MunGDB版本来说,这很好。现在长值被序列化为bson,如下所示:
"date": {
"$numberLong": "1551172199214"
}
当我尝试使用jacksons objectmapper反序列化时
无法反序列化
javax.xml.datatype.XMLGregorianCalendar
超出起始对象标记的实例原因我很清楚,因为long值在自己的bson样式的对象中。
到目前为止,我已经试过使用这样的bSondocument:
public static <T> T fromDB(DBObject o, Class<T> clazz) {
try {
BsonDocument parse = BsonDocument.parse(o.toString());
return OBJECT_MAPPER.readValue(parse.toJson(), clazz);
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
但这仍然不能将bson部分转换为json。
有没有任何方法可以使用jacksons对象映射器将bson反序列化到给定的类?
或者只将其转换为dbobject而不使用bson部件?
最佳答案
看起来您需要配置objectmapper来以不同的方式反序列化xmlgregoriancalendar。
public class XMLGregorianCalendarDeserializer extends JsonDeserializer<XMLGregorianCalendar> {
private ObjectMapper objectMapper = new ObjectMapper();
@Override
public XMLGregorianCalendar deserialize(
JsonParser jsonParser, DeserializationContext deserializationContext)
throws IOException, JsonProcessingException {
Map<String, String> bsonStringAsMap =
objectMapper.readValue(
jsonParser.readValueAsTree().toString(), new TypeReference<Map<String, String>>() {});
String timestampString = bsonStringAsMap.get("$numberLong");
if (timestampString != null && !timestampString.isEmpty()) {
long timestamp = Long.parseLong(timestampString);
Date date = new Date(timestamp);
GregorianCalendar gregorianCalendar = new GregorianCalendar();
gregorianCalendar.setTime(date);
return DatatypeFactory.newInstance().newXMLGregorianCalendar(gregorianCalendar);
}
return null;
}
}
然后,您可以使用此注释字段并按原来的方式反序列化:
@JsonDeserialize(using=XMLGregorianCalendarDeserializer.class)
@XmlSchemaType(name = "dateTime")
protected XMLGregorianCalendar date;
关于java - 来自MongoDB BSON的Jackson ObjectMapper,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54883074/