我有一个字段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
答案 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
}
}