【问题标题】:Jackson JSON de-serialization with views杰克逊 JSON 反序列化与视图
【发布时间】:2017-05-15 11:48:01
【问题描述】:

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

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

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

这就是我想要的:

查看 1:

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

查看 2:

{ userId: "16418256815618" }

【问题讨论】:

    标签: json jackson deserialization


    【解决方案1】:

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

        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 中的说明注册一个序列化器修饰符,使用默认序列化器来完成它。

    【讨论】:

      猜你喜欢
      • 2015-04-07
      • 2014-12-18
      • 1970-01-01
      • 2012-01-11
      • 2014-02-21
      • 1970-01-01
      • 2013-05-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多