2017-07-16 26 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とjacksonのドキュメントを検索しますが、プロパティ名を削除する方法は何も見つかりませんでした。

可能かどうかわかりません。あなたはwriteStartArrayを使用する必要があり、配列を書き込むには、データクラスの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(); 
    } 
} 

を書くことができますとにかく

、ジャクソン

と春ブーツを使用してイム
+1

を? –

+0

Joltは次のようなものに最適です:https:// github。com/bazaarvoice/jolt –

+0

JSONフィールドの名前を 'stocks'にしたい場合は、Javaフィールドの名前を' rates'にしないでください.JSON値を配列の配列(2D配列)にしたい場合は、 JavaフィールドをBeanオブジェクトの 'List'にしますが、リストのリスト、配列のリスト、または配列の配列にします。次に、カスタムシリアライザを作成する必要はありません。 – Andreas

答えて

1

uが

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(); 

    } 

} 

JSONシリアライズされたクラスをカスタマイズして、することができます:いいえ、ちょうど2次元配列だこと

@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

オプション1

writeEndArray

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

配列の書き込みの例はhereです。その後、

そして、あなたのクラスに注釈としてそれを使用する:正確な構造を表し、問題にアプローチする他の方法は、(DTOのよ​​うな)別のクラスを作ることです

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

オプション2

あなたがjsonで必要とする名前を付けます。次に、現在のオブジェクトを新しいオブジェクト(DTO)にマップし、DTOをシリアル化することができます。それは何が起こっているかをより明らかだ

1):ので

実は私は第二のアプローチとなるだろう。 StdSerializerのアプローチでは、コードの読者はカスタムリーダーの使い方を見分ける必要があり、技術などに精通していない可能性があります。

2)これらのクラスをいくつかの残りのAPIの戻り値の型として使用し、それらを(Spring MVCのように)直列化し、Swaggerのようないくつかの残りのドキュメンテーションツールを使用する必要がある場合、それはDTOアプローチでよりうまくいくでしょうし、カスタムシリアライザではまったく動作しないかもしれません。

関連する問題