我正在使用Jackson,以便在客户端和服务器之间以JSON类型发送数据。 我正在尝试使用Jackson的完整绑定功能,我将其应用于标准POJO。 问题是杰克逊似乎在服务器上编组时添加了冗余数据,因此当我尝试将其解组回客户端的POJO时,我收到了错误。
以下是Jackson String的摘录:
{ “_类”: “com.mycoomp.MyObject”, “_ ID”:{ “时间”:1300314145000, “新”:假的, “机器”:1652794940, “公司”: - 510750341}, “语言” : “”, “类型” .....
MyObject包含“language”和“type”,但它不包含“time”,“new”和“machine”,它们不属于它,但在客户端,我收到此错误:
无法识别的字段“time”(类org.bson.types.ObjectId),未在[来源:java.io.StringReader@1c56c60上标记为可忽略; line:1,column:102](通过引用链:com.mycomp.MyObject [“_ id”] - > org.bson.types.ObjectId [“time”])
任何想法......?
答案 0 :(得分:2)
解决方案是为ObjectId提供自定义序列化器/反序列化器:
public class ObjectIdMapping {
public static class ObjectIdSerializer extends JsonSerializer<ObjectId>{
@Override
public void serialize(ObjectId id, JsonGenerator json,
SerializerProvider provider) throws IOException,
JsonProcessingException {
json.writeString(id.toString());
}
}
public static class ObjectIdDeerializer extends JsonDeserializer<ObjectId>{
@Override
public ObjectId deserialize(JsonParser jp, DeserializationContext context)
throws IOException, JsonProcessingException {
if (!ObjectId.isValid(jp.getText())) throw context.mappingException("invalid ObjectId " + jp.getText());
return new ObjectId(jp.getText());
}
}
}
将它们注册为the documentation中描述的任何方法。例如,添加您的POJO:
@JsonSerialize(using = ObjectIdMapping.ObjectIdSerializer.class)
@JsonDeserialize(using = ObjectIdMapping.ObjectIdDeerializer.class)
public ObjectId od;
答案 1 :(得分:1)
您需要为要序列化的类型提供类型定义。杰克逊不会添加任何不能从对象中发现的条目(通过getter,公共字段或明确注释);除非您添加@JsonTypeInfo注释以添加类型标识符。
因此,序列化的对象可能有更多将被序列化的公共字段吗?
答案 2 :(得分:1)
我遇到同样的问题,我刚刚碰到过这个问题。似乎是mongo-jackson-mapper
的工作我还建议从你的域名中删除ObjectId等基础结构类。