杰克逊正在向POJO添加冗余数据,然后无法读回

时间:2011-03-16 22:32:51

标签: json jackson

我正在使用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”])

任何想法......?

3 个答案:

答案 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等基础结构类。