2017-04-11 14 views
1

私は、シリアライゼーション値に影響を与えるカスタムjackson注釈を作成しようとしています。カスタム値のシリアル化のためのJacksonカスタム注釈

意味:

class X { 
@Unit("mm") int lenght; 
... 
} 

今すぐオブジェクトX(10)につながるserializaling:

{ 
    "lenght" : "10 mm" 
} 

は、どのように私はそれを達成することができますか?

答えて

2
import com.fasterxml.jackson.core.JsonGenerationException; 
import com.fasterxml.jackson.core.JsonGenerator; 
import com.fasterxml.jackson.core.JsonProcessingException; 
import com.fasterxml.jackson.databind.*; 
import com.fasterxml.jackson.databind.annotation.JsonSerialize; 
import com.fasterxml.jackson.databind.ser.ContextualSerializer; 
import com.fasterxml.jackson.databind.ser.std.StdSerializer; 
import lombok.AllArgsConstructor; 
import lombok.Data; 
import lombok.NoArgsConstructor; 

import java.io.IOException; 
import java.lang.annotation.ElementType; 
import java.lang.annotation.Retention; 
import java.lang.annotation.RetentionPolicy; 
import java.lang.annotation.Target; 

// Create own annotation storing your unit value 

@Target({ ElementType.FIELD }) 
@Retention(RetentionPolicy.RUNTIME) 
@interface Unit { 
    String value(); 
} 

// Create custom serializer checking @Unit annotation 

class UnitSerializer extends StdSerializer<Integer> implements ContextualSerializer { 

    private String unit; 

    public UnitSerializer() { 
     super(Integer.class); 
    } 

    public UnitSerializer(String unit) { 
     super(Integer.class); 
     this.unit = unit; 
    } 

    @Override 
    public void serialize(Integer value, JsonGenerator jgen, SerializerProvider provider) throws IOException { 
     jgen.writeString(String.format("%d %s", value, unit)); 
    } 

    @Override 
    public JsonSerializer<?> createContextual(SerializerProvider prov, BeanProperty property) throws JsonMappingException { 
     String unit = null; 
     Unit ann = null; 
     if (property != null) { 
      ann = property.getAnnotation(Unit.class); 
     } 
     if (ann != null) { 
      unit = ann.value(); 
     } 
     return new UnitSerializer(unit); 
    } 
} 

@NoArgsConstructor 
@AllArgsConstructor 
@Data 
class X { 
    @JsonSerialize(using = UnitSerializer.class) 
    @Unit("mm") 
    private int length; 
} 

public class Runner { 
    public static void main(String[] args) throws JsonProcessingException { 

     X x = new X(10); 
     ObjectMapper objectMapper = new ObjectMapper(); 
     System.out.println(objectMapper.writeValueAsString(x)); 
    } 
} 

結果:私が探していたまさに

{"length":"10 mm"} 
+0

!どうもありがとう。 – user2186425

関連する問題