20

JSON にシリアル化するときに、オブジェクトに新しいプロパティを追加する必要があります。プロパティの値は実行時に計算され、オブジェクトには存在しません。また、同じオブジェクトを使用して、さまざまなセットのフィールドを持つさまざまな JSON を作成できます (サブクラスを持つ基本クラスを持つようなものですが、JSON 生成のためだけに作成したくありません)。

オブジェクトのフィールドのセット全体のシリアル化を処理するカスタムシリアライザークラスの作成を含まない、それを行う最良の方法は何ですか? または、いくつかの「基本的な」シリアライザーを継承し、単にその出力を取得して、何らかの方法で新しいフィールドを追加することは可能でしょうか?

mixinsについて学びましたが、一部のフィールドの名前を変更/非表示にすることは可能のようですが、追加のフィールドを追加することはできないようです。

4

3 に答える 3

15

値クラスにメソッドを追加するだけではいけませんか?パブリックである必要はなく、ゲッターの命名規則を使用する必要もないことに注意してください。あなたは次のようなことをすることができます:

public class MyStuff {
   // ... the usual fields, getters and/or setters

   @JsonProperty("sum") // or whatever name you need in JSON
   private int calculateSumForJSON() {
        return 42; // calculate somehow
   }
}

それ以外の場合は、POJOをJSONツリー値に変換できます。

JsonNode tree = mapper.valueToTree(value);

次に、プロパティなどを追加して変更します。

于 2013-01-16T21:21:21.893 に答える
3

1 つのオプションは、JSON に書き込む前に、このプロパティのフィールドを追加してオブジェクトに設定することです。2 番目のオプションは、プロパティが他のオブジェクト プロパティから計算できる場合、次のように getter を追加するだけです。

public String getFullName() {
  return getFirstName() + " " + getLastName();
}

一致するフィールドがなくても、Jackson は JSON の書き込み中にこのゲッターを自動的に呼び出しfullName、JSON 出力のように表示されます。それが機能しない場合、3 番目のオプションは、オブジェクトをマップに変換してから、必要に応じて操作することです。

ObjectMapper mapper //.....
MyObject o //.....
long specialValue //.....
Map<String, Object> map = mapper.convertValue(o, new TypeReference<Map<String, Object>>() { });
map.put("specialValue", specialValue);

アンマーシャリングについては質問ではありませんが、アンマーシャリングも行う必要がある場合は、最初のオプションは正常に機能しますが、2 番目の 2 つは微調整が必​​要です。

そして、同じオブジェクトの異なるフィールドを書くことに関しては、それは仕事のように聞こえます@JsonView

于 2013-01-17T01:02:34.343 に答える