2015-11-03 47 views
0

我期待創造從DTO一個JSON字符串namevalues爲每個屬性與Json和/或Jackson註釋 。 我的DTO:轉換對象JSON與名稱的屬性

class DTO { 
    @??? = "individual.lastName" 
    private List<String> lastName = ["LastName1","LastName2"]; 
    @??? = "individual.firstName" 
    private List<String> firstName = ["FistName1"]; 
    ... 
} 

結果預計:

{ 
"fields": [ 
    { 
     "name": "individual.lastName", 
     "values": [ 
      "LastName1", 
      "LastName2" 
     ] 
    }, 
    { 
     "name": "individual.firstName", 
     "values": [ 
      "FirstName1" 
     ] 
    } 
] 
} 
+0

你試過'@ javax.xml.bind.annotation.XmlElement(NAME = 「individual.lastName」)'? – Smutje

+0

@JsonProperty(「name」)但不映射真實名稱(individual.lastname)或@JsonSerialize不起作用。 –

回答

0

您正在尋找具有兩個屬性爲每個DTO的屬性創建一個單獨的JSON對象。換句話說,你要轉換的List小號Map S和序列化Map秒。

這可以通過com.fasterxml.jackson.databind.util.Converter類+ @JsonSerialize註釋來實現。問題在於Jackson將轉換器與類型關聯,因此所有List類型的屬性將具有相同的轉換器。另一個問題是轉換器不知道DTO屬性的名稱。預計僅處理該值。

所以我們只剩下了一個符合特定的POJO的DTO類的自定義序列化,可以訪問所有的屬性,可以明確地產生什麼是必需的。我補充說,允許每個DTO屬性指定「JSON名」自定義註釋:

@Retention(RetentionPolicy.RUNTIME) 
@Target(ElementType.FIELD) //can use in field only. 
public @interface JsonName 
{ 
    String value(); 
} 


@JsonSerialize(using = DTOSerializer.class) 
public class DTO 
{ 
    @JsonName("individual.lastName") 
    public List<String> lastName = Arrays.asList("LastName1", "LastName2"); 
    @JsonName("individual.firstName") 
    public List<String> firstName = Arrays.asList("firstName1"); 
} 

的自定義序列讀取的DTO的所有領域,將查找@JsonName註釋和分配JSON「名」財產註釋值:

public class DTOSerializer extends JsonSerializer<DTO> 
{ 
    @Override 
    public void serialize(DTO value, JsonGenerator gen, SerializerProvider serializers) 
      throws IOException, JsonProcessingException 
    { 
     gen.writeStartObject(); 
     gen.writeFieldName("fields"); 
     gen.writeStartArray(); 
     Field[] fields = dto.getClass().getDeclaredFields(); 
     for (Field field : fields) { 
      if (field.isAnnotationPresent(JsonName.class)) { 
       Object fieldValue = null; 
       try { 
        fieldValue = field.get(dto); 
       } catch (ReflectiveOperationException e) { 
        e.printStackTrace(); 
       } 
       if (fieldValue != null) { 
        String fieldName = ((JsonName)field.getAnnotation(JsonName.class)).value(); 
        gen.writeStartObject(); 
        gen.writeStringField("name", fieldName); 
        gen.writeObjectField("values", fieldValue); 
        gen.writeEndObject(); 
       } 
      } 
     } 

     gen.writeEndArray(); 
     gen.writeEndObject(); 
    } 
} 

調用

new ObjectMapper().writeValue(System.out, new DTO()); 

正好產生預期

{"fields":[{"name":"individual.lastName","values":["LastName1","LastName2"]},{"name":"individual.firstName","values":["firstName1"]}]} 
+0

我想要爲例: 公共類DTO { @JSonName( 「名稱」) @JsonName( 「姓」) => { 「姓名」; 「individidual.lastName」,.... @JsonValueName(值) @JsonValue(VAR firsname值) => ... 「值」:[ 「.... 」「 ...」]} 公共列表的firstName 我有60個特性映射。 ... –

+0

使用自定義序列化,你有完全的自由產生你所需要的JSON,所以你需要開發需要生成的屬性的元數據。您可以填充的HashMap與屬性名稱,值,也可以寫自己的註解,你可以在串行 –

+0

我補充說,允許每個指定「JSON名」 DTO屬性自定義註解調查,看看編輯答案 –