我得到了一个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/

10-14 10:17