2015-11-04 40 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()