2017-10-12 15 views
0

使って地図の唯一の「値」をシリアライズ、私はあなただけでJSONにこれをシリアル化した場合JSON - 私のデータ転送オブジェクトではジャクソン

private Map<Long, StateDomain> stateDomains; 

、あなたが取得する宣言を持って

{ 
    stateDomains:[{"key1": stateDomain1}, {"key2": stateDomain2}...] 
} 

私がしたくない。その代わり、は、私はそれがリストとしてこのマップの値だけをシリアル化するためである

{ 
    stateDomains:[{stateDomain1}, {stateDomain2}...] 
} 

を、なりたい、と長いキーとのペアリングを捨てます。

これはどのようにしてJacksonにとって最も効果的でしょうか?

+0

なぜ単純にも '民間リスト stateDomainList'を持っているし、あなたをマークしていませんフィールド 'stateDomains'を' @JsonIgnore'としますか? – Seelenvirtuose

+0

@Seelenvirtuose私はパフォーマンスヒットを最小限に抑えようとします。最高のパフォーマンスを得るには、マップが必要です。私がパラレルフィールドを維持する場合、私は並行してリストを更新する必要があります。これはもちろん実行可能ですが、もう少し論理が必要です。私が今考えているのは、JsonIgnoreのプロパティとJsonPropertyの注釈だけです。値を返すだけのゲッターです。 –

答えて

1

このアクションを実行するには、2つの方法があります。

  1. 汚い方法:StateDomainの唯一のコレクションを返すためにstateDomains

変更ゲッター:

は例:

public Collection<StateDomain> getStateDomains() { 
     return stateDomains.values(); 
} 
  1. 地図のカスタムserializerを作成します。

例:

class CustomSerializer extends JsonSerializer<Map<Long, StateDomain>> { 
    @Override 
    public void serialize(final Map<Long, StateDomain> value, final JsonGenerator jgen, final SerializerProvider provider) 
      throws IOException, JsonProcessingException { 
     jgen.writeObject(value.values()); 
    } 
} 

DTOにシリアライザを追加します。

@JsonSerialize(using = CustomSerializer.class) 
private Map<Long, StateDomain> stateDomains; 
+0

私はあなたがゲッターを汚い方法と呼ぶとは思わない。実際に、getStateDomainsValues()という名前を付けて、アノテーションを使用してJson Fieldの名前stateDomainsを作成することができます。 –

関連する問題