【问题标题】:How to invoke JsonSerializer inside another custom JsonSerializer Jackson如何在另一个自定义 JsonSerializer Jackson 中调用 JsonSerializer
【发布时间】:2015-08-26 13:55:47
【问题描述】:

我有两节课。首先是二等字段。

class A {
  @JsonSerializer(using = CustomBSerializer.class)
  private B b;
}

class B {
  ...
}

我有两个自定义序列化器:

class CustomBSerializer extends JsonSerializer<B> {
  ...
}

class CustomASerializer extends JsonSerializer<A> {
    @Override
    public void serialize(A a, JsonGenerator jgen, SerializerProvider provider)
            throws IOException, JsonProcessingException {
        jgen.writeStartObject();
        //write here
        jgen.writeEndObject();
    }

}

我应该添加什么方法而不是在CustomASerializer 中添加注释来使用CustomBSerializer 写入字段b 的序列化值?

【问题讨论】:

    标签: java json jackson


    【解决方案1】:

    您可以使用writeObjectField 方法。 Jackson 应该使用默认或自定义序列化程序(如果存在)。

    下面的例子:

    import com.fasterxml.jackson.core.JsonGenerator;
    import com.fasterxml.jackson.core.JsonProcessingException;
    import com.fasterxml.jackson.databind.JsonSerializer;
    import com.fasterxml.jackson.databind.ObjectMapper;
    import com.fasterxml.jackson.databind.SerializerProvider;
    import com.fasterxml.jackson.databind.annotation.JsonSerialize;
    
    import java.io.IOException;
    import java.util.Date;
    
    public class Main {
    
        public static void main(String[] args) throws Exception {
            B b = new B();
            b.setProperty("Value");
    
            A a = new A();
            a.setB(b);
    
            ObjectMapper mapper = new ObjectMapper();
            System.out.println(mapper.writerWithDefaultPrettyPrinter().writeValueAsString(a));
        }
    }
    
    @JsonSerialize(using = ASerializer.class)
    class A {
    
        private B b;
    
        public B getB() {
            return b;
        }
    
        public void setB(B b) {
            this.b = b;
        }
    }
    
    class ASerializer extends JsonSerializer<A> {
    
        @Override
        public void serialize(A value, JsonGenerator gen, SerializerProvider serializers) throws IOException, JsonProcessingException {
            gen.writeStartObject();
            gen.writeStringField("now", new Date().toString());
            gen.writeObjectField("b", value.getB());
            gen.writeEndObject();
        }
    }
    
    @JsonSerialize(using = BSerializer.class)
    class B {
    
        private String property;
    
        public String getProperty() {
            return property;
        }
    
        public void setProperty(String property) {
            this.property = property;
        }
    }
    
    class BSerializer extends JsonSerializer<B> {
    
        @Override
        public void serialize(B value, JsonGenerator gen, SerializerProvider serializers) throws IOException, JsonProcessingException {
            gen.writeStartObject();
            gen.writeStringField("p", value.getProperty());
            gen.writeEndObject();
        }
    }
    

    打印:

    {
      "now" : "Wed Aug 26 22:27:08 CEST 2015",
      "b" : {
        "p" : "Value"
      }
    }
    

    【讨论】:

    • 我试过了,但它没有使用我的自定义 JsonSerializer。
    • 您是如何为 A 类注册自定义序列化程序的?
    • 尝试将JsonSerialize 注释放在类级别而不是属性级别。
    • 是的,我也做了同样的事情,而且效果很好,但是我可以通过属性级别的注释来做到这一点吗?
    • 您正在为一个也有自定义序列化程序的类编写自定义序列化程序。也许最快的方法是创建新的自定义序列化程序并使用它:gen.writeFieldName("b"); BSerializer bSerializer = new BSerializer(); bSerializer.serialize(value.getB(), gen, serializers);
    【解决方案2】:

    您并不总是可以访问类代码,您不会总是有可能修改 A 或 B 类以放置注解 @JsonSerialize(using = BSerializer.class)。在这些情况下,您需要在 CustomASerializer 中调用 CustomBSerializer,这也是问题首先提出的问题。这是这样做的方法:

    class CustomASerializer extends JsonSerializer<A> {
    
        @Override
        public void serialize(A a, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonProcessingException {
    
            final ObjectMapper mapper = (ObjectMapper)jgen.getCodec();
            SimpleModule module =  new SimpleModule("CustomBSerializer");
            module.addSerializer(B.class, new CustomBSerializer());
            mapper.registerModule(module);
    
            jgen.writeStartObject();
            mapper.writeValue(jgen, a.getB());
            jgen.writeEndObject();
        }
    
    } 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-28
      • 2016-02-26
      • 2015-07-13
      • 1970-01-01
      • 2018-05-21
      • 2016-06-27
      • 2012-05-25
      • 1970-01-01
      相关资源
      最近更新 更多