如何在自定义json序列化程序中获取属性或字段名称

时间:2015-11-04 10:24:53

标签: java json jackson

我有一个字段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);
    }

}

由于我需要使用类似的逻辑序列化大约十个其他字段,这取决于字段 name ,如果我可以在自定义序列化程序中获取属性名称,它将非常有用 - 而不是写十个相同的序列化器。

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

我正在使用Jackson 2.6

4 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:2)

您可以在自定义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 :(得分:2)

您可以通过调用 jgen.getOutputContext()获取当前属性名称.getCurrentName()

答案 3 :(得分:0)

您可以通过Customized SerzializerProvider

实现这一目标
public class EmptyContentSerializerProvider extends DefaultSerializerProvider {

    @Override
    public JsonSerializer<Object> findNullValueSerializer(BeanProperty property) throws JsonMappingException {
         property.getName(); //this can extract the filed name
    }
}
相关问题