Jackson JSON反序列化视图

时间:2017-05-15 11:48:02

标签: json jackson deserialization

我试图根据视图序列化一个属性。不幸的是,下面的代码并没有起作用,因为Jackson报告了一个冲突的getter属性" userId"。有没有办法根据特定表示中的视图获取对象?

copysign

这就是我想要的:

查看1:

  @JsonView(Views.Mongo.class)
  @JsonProperty("userId")
  public ObjectId getUserId() {
        return userId;
  }

  @JsonView(Views.Frontend.class)
  @JsonProperty("userId")
  public String getUserIdAsString() {
      return userId.toString();
  }

观看2:

{ userId: { '$oid' : "16418256815618" } }

1 个答案:

答案 0 :(得分:0)

我认为您可以编写一个自定义序列化程序,它根据活动视图执行此任务,如下所示。

    public class ObjectIdSerializer extends JsonSerializer<ObjectId> {

    @Override
    public void serialize(ObjectId objectId, JsonGenerator gen, SerializerProvider provider) throws IOException {
        if (provider.getActiveView() == Frontend.class) {
            gen.writeString(objectId.toString());
        } else {
            // Do default serialization of ObjectId. 
            gen.writeStartObject();
            gen.writeFieldName("idField1");
            gen.writeString(objectId.getIdField1());
            gen.writeFieldName("idField2");
            gen.writeString(objectId.getIdField2());
            gen.writeEndObject();
        }
    }
}

然后修改你的pojo,如下所示

@JsonSerialize(using=ObjectIdSerializer.class)
public ObjectId getUserId() {
    return userId;
}

您不必在getter / field中传递任何视图注释,因为在自定义序列化器中需要注意。

在此示例中,我手动完成了默认序列化。或者,您可以使用默认序列化程序通过注册序列化修饰符来完成它,如问题How to access default jackson serialization in a custom serializer中所述。