2017-07-16 115 views
1

我有一個JSON結構是這樣的:傑克遜序列化,而不性質

{ 
    "name": "LS", 
    "stocks": [ 
     { 
     "x": 1500234365000, 
     "y": 0.000000000000 
     }, 
     { 
     "x": 1500234427000, 
     "y": 0.000015154000 
     }, 
     { 
     "x": 1500234481000, 
     "y": 0.000015518740 
     }, 
     { 
     "x": 1500234548000, 
     "y": 0.008415518740 
     } 
    ] 
} 

但我需要我的JSON看起來像這樣:

{ 
    "name": "LS", 
    "stocks": [ 
     [1500234365000,0.000000000000], 
     [1500234427000,0.000015154000], 
     [1500234481000,0.000015518740], 
     [1500234548000,0.008415518740] 
    ] 
} 

我的映射類:

public class View implements Serializable { 
    private static final long serialVersionUID = 1636349140413063122L; 

    @Getter @Setter 
    private String name; 

    @JsonInclude(Include.NON_EMPTY) 
    @Getter @Setter 
    private List<Data> rates = new ArrayList<Data>(); 
} 

和數據陣列:

public class Data implements Serializable { 
    private static final long serialVersionUID = 2926346626990185211L; 

    @JsonProperty("x") 
    @Getter @Setter 
    private Long date; 

    @JsonProperty("y") 
    @Getter @Setter 
    private BigDecimal value; 

有任何本地的方式來做到這一點?我搜索槽stackoverflow和傑克遜文檔,但沒有發現如何刪除屬性名稱。

不知道它是否可能。

總之,使用彈簧啓動與傑克遜

+1

這只是一個二維數組,不是嗎? –

+0

Jolt非常適合這樣的東西:https:// github。com/bazaarvoice/jolt –

+0

如果您希望將JSON字段命名爲'stocks',請不要將Java字段命名爲'rates',並且如果您希望JSON值是數組(數組)的數組,則不要不要讓Java字段成爲Bean對象的List,而是將它作爲列表,列表或數組的列表。那麼你將不必編寫自定義序列化程序。 – Andreas

回答

1

U可以自定義JSON序列類

public class MyStdSerializer extends StdSerializer<Data> { 

    public MyStdSerializer(){ 
     this(null); 
    } 
    public MyStdSerializer(Class<Data> t) { 
     super(t); 
    } 


    @Override 
    public void serialize(Data value, JsonGenerator jgen, SerializerProvider provider) 
      throws IOException, JsonGenerationException { 

     jgen.writeStartArray(); 
     jgen.writeNumber(value.getDate()); 
     jgen.writeNumber(value.getValue()); 
     jgen.writeEndArray(); 

    } 

} 

然後:

@JsonSerialize(using=MyStdSerializer.class) 
public class Data implements Serializable{ 

    private static final long serialVersionUID = 2926346626990185211L; 

     @JsonProperty("x") 
     private Long date; 

     @JsonProperty("y") 
     private BigDecimal value; 

     public Long getDate() { 
      return date; 
     } 

     public void setDate(Long date) { 
      this.date = date; 
     } 

     public BigDecimal getValue() { 
      return value; 
     } 

     public void setValue(BigDecimal value) { 
      this.value = value; 
     } 

} 
1

選項IM 1

你可以寫一個custom serializer的數據類

public class ItemSerializer extends StdSerializer<Item> { 
      
    public ItemSerializer() { 
        this(null); 
    } 
    
    public ItemSerializer(Class<Item> t) { 
        super(t); 
    } 
  
    @Override 
    public void serialize(
      Item value, JsonGenerator jgen, SerializerProvider provider) 
      throws IOException, JsonProcessingException { 
   
        jgen.writeStartObject(); 
        jgen.writeNumberField("id", value.id); 
        jgen.writeStringField("itemName", value.itemName); 
        jgen.writeNumberField("owner", value.owner.id); 
        jgen.writeEndObject(); 
    } 
} 

要寫出你必須使用writeStartArray數組和writeEndArray

jgen.writeStartArray(); 
    jgen.writeNumber(id); 
    jgen.writeNumber(number1); 
    jgen.writeEndArray(); 

數組寫入示例來自here

,然後用它作爲註解你的類:

@JsonSerialize(using = ItemSerializer.class) 
public class Item {} 

選項2

的另一種方法來解決這個問題是讓另一個類(如DTO)表示確切結構並命名你需要在json中。然後,您可以先將當前對象映射到新對象(DTO)並序列化DTO。

其實我會用第二種方法去,因爲:

1)這是比較明顯的是怎麼回事。使用StdSerializer方法,您的代碼的讀者必須知道自定義閱讀器的用法,並且可能不熟悉該技術等。

2)如果您使用這些類作爲某些其餘api的返回類型並使用傑克遜爲了序列化它們(比如Spring MVC)並且必須使用一些其他文檔工具(如Swagger),使用DTO方法可以更好地工作,並且可能根本無法使用自定義序列化器。