2015-11-04 31 views
1

我有一个字段的custom JsonSerializer(简化代码):如何获得属性或字段名称自定义JSON序列

@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); 
    } 

} 

因为我需要序列约十等领域具有类似的逻辑,这只是取决于字段名称,如果我可以在自定义序列化程序中获得属性名称,它将非常有帮助 - 而不是写入十个相同的序列化程序。

我见过的serialize()方法内我可以得到JsonGenerator.getCurrentValue()整个对象(见this answer),但我没有”找到一个办法让字段名。

我使用的是杰克逊2.6

回答

2

如果实现ContextualSerializer,这将被用来生产你的串行的“语境”版本,即一个正在使用中的BeanProperty配置:

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

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

+0

你说的是在我的'JsonSerializer'中添加一个私人字段,'createContextual ()'用'property.getName()'设置并最终返回'this'?如果是这样,它看起来有点难看,但工作。 – watery

+0

@watery:createContextual()应该添加属性名称来创建序列化程序的新实例,而不仅仅是修改自身 – araqnid

0

您可以通过自定义SerzializerProvider

public class EmptyContentSerializerProvider extends DefaultSerializerProvider { 

    @Override 
    public JsonSerializer<Object> findNullValueSerializer(BeanProperty property) throws JsonMappingException { 
     property.getName(); //this can extract the filed name 
    } 
} 
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); 
    } 
} 
1

你可以通过调用jgen得到当前的属性名称。 getOutputContext()。getCurrentName()