【问题标题】:how to get property or field name in a custom json serializer如何在自定义 json 序列化程序中获取属性或字段名称
【发布时间】:2015-11-04 10:24:53
【问题描述】:

我有一个字段的custom JsonSerializer(简化代码):

@JsonSerialize(using=Text1Serializer.class)
@JsonProperty("text1") // I need this inside the custom serializer
@Override
public String getTextOne() {
    return "foo";
}

// ...

public static class Text1Serializerextends JsonSerializer<String> {

    @Override
    public void serialize(String value, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonProcessingException {
        // how to get "text1" here?
        provider.defaultSerializeValue(value, jgen);
    }

}

由于我需要用类似的逻辑序列化大约 10 个其他字段,这仅取决于字段 name,如果我能在自定义序列化程序中获取属性名称,这将对我很有帮助 -而不是编写十个相同的序列化程序。

我已经看到在serialize() 方法中我可以使用JsonGenerator.getCurrentValue() 获取整个对象(请参阅this answer),但我没有找到获取字段名称的方法。

我使用的是 Jackson 2.6

【问题讨论】:

    标签: java json jackson


    【解决方案1】:

    您可以像这样在自定义 json 序列化程序中获取字段名称:

    @JsonComponent
    public class Text1Serializerextends extends JsonSerializer<String> {
        @Override
        public void serialize(String value, JsonGenerator jgen, SerializerProvider provider) throws IOException {
            // will output "text1"
            System.out.println(jgen.getOutputContext().getCurrentName());
    
            provider.defaultSerializeValue(value, jgen);
        }
    }
    

    【讨论】:

      【解决方案2】:

      如果您实现 ContextualSerializer,这将用于生成序列化器的“上下文”版本,即使用 BeanProperty 配置的序列化器:

      public JsonSerializer<?> createContextual(SerializerProvider prov, BeanProperty property)
          throws JsonMappingException;
      

      这应该返回一个为给定属性定制的新实例:它不必与非定制的序列化程序是同一个类(尽管标准的 Jackson 实现似乎都以这种方式工作)。

      【讨论】:

      • 您是说在我的JsonSerializer 中添加一个私有字段,该字段将createContextual() 设置为property.getName() 并最终返回this?如果是这样,它看起来有点难看,但有效。
      • @watery: createContextual() 应该创建一个新的序列化程序实例,并添加属性名称,而不仅仅是修改自身
      【解决方案3】:

      你可以通过调用jgen.getOutputContext().getCurrentName()

      来获取当前的属性名

      【讨论】:

        【解决方案4】:

        您可以通过 Customized SerzializerProvider 来实现

        public class EmptyContentSerializerProvider extends DefaultSerializerProvider {
        
            @Override
            public JsonSerializer<Object> findNullValueSerializer(BeanProperty property) throws JsonMappingException {
                 property.getName(); //this can extract the filed name
            }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-08-22
          • 1970-01-01
          • 1970-01-01
          • 2012-10-22
          • 1970-01-01
          • 2023-03-03
          相关资源
          最近更新 更多