LinkedHashMap<String, Object>
に拡張されたモデルクラスがいくつかあります。マップのgetメソッドとputメソッドをラップするgetterとsetterを定義しています。私はこれらのクラスのインスタンスを直列化しようとしていますが、JacksonはRESTEasyを使用していますが、Jacksonはget300に注意を払うことを拒否します。代わりに、バッキング・マップのキーと値のペアをシリアル化するだけです。私は@JsonAutoDetect
を使って、すべてのメソッドとフィールドの自動検出を無効にしようとしましたが、何も変更されませんでした。 JacksonがMapを自動的にシリアル化しないようにする方法はありますか、またはLinkedHashMap<String, Object>
を拡張しない新しいモデルクラスを作成する必要がありますか?Jackson - シリアライズ時にマップスーパークラスを無視する
答えて
私は
LinkedHashMap<String, Object>
を拡張し、いくつかのモデルクラスを持っている:あなた:彼らはこれがない継承を使用する際の典型的な例ですラップ地図のgetゲッターとセッターを定義し、メソッドに
を置きます他のコード(Jacksonなど)があなたのクラスをスーパークラスのインスタンスのように扱っていることがわかりました。これはあなたがしたいことではありません。これらのような場合(一般的に)、通常は継承よりも構成を使用するほうがよいでしょう。
にモデルクラスを書き換え、マップを拡張するのではなくにすることをお勧めします。あなたは道よりはるかに多くの制御を得て、結果として得られるモデルは脆弱ではありません。モデルをMap
として表示する必要がある場合は、そのビューをレンダリングするasMap
メソッド(または同様のもの)を実装します。
@ skaffmanの回答に同意します。しかし、簡単に継承構造を変えることができない場合は、これを回避する方法があるかもしれません。
一つの可能性は、あなたがゲッター/セッターを定義するインターフェイスを持っているならば、あなたはジャクソンを強制する
@JsonSerialize(as=MyInterface.class)
@JsonDeserialize(as=MyInterface.class)
は、特定のインターフェイスを介して利用可能であるものを使用して追加することができますということです。
カスタムシリアライザ/デシリアライザも可能ですが、それはかなりの作業です。
あなたはジャクソンのorg.codehaus.jackson.map.deser.StdDeserializerProvider
を拡張し、独自のorg.codehaus.jackson.map.DeserializerProvider
を実装し、上書きすることができます方法_createDeserializer
:
import org.codehaus.jackson.map.SerializerProvider;
import org.codehaus.jackson.map.deser.StdDeserializerProvider;
import org.codehaus.jackson.map.DeserializationConfig;
...
class MyDeserializerProvider extends StdDeserializerProvider {
@Override
protected JsonDeserializer<Object> _createDeserializer(DeserializationConfig config, JavaType type, BeanProperty property) throws JsonMappingException {
if (type.isMapLikeType()) { // (1)
return this._factory.createBeanDeserializer(config, this, type, property);
} else {
return super._createDeserializer(config, type, property);
}
}
}
(1)を使用している場合は、条件のカスタムデシリアライザはObjectMapperで直接登録されている
ニーズを満たしています:
ObjectMapper om = new ObjectMapper();
om.setDeserializerProvider(new MyDeserializerProvider());
これをジャクソン1.9.11でテストしました。
- 1. Jackson JSON Marshall getterを無視する
- 2. Jackson:親クラスのプロパティを無視する
- 3. Jackson ObjectMapperをシリアライズ可能にする
- 4. jacksonでジェネリックJSONをシリアライズ
- 5. Jacksonとのルートプリミティブオブジェクトのシリアライズ
- 6. JSONにシリアライズするときにDataMemberが無視される
- 7. シリアル化時にプロパティを無視する
- 8. jsonをシリアライズするときにJsonProperty(PropertyName = "someName")を無視する方法は?
- 9. json/jacksonのシリアル化でリストルートを無視する方法はありますか?
- 10. Jackson XmlMapperを使用してXML DOMにシリアライズ
- 11. JacksonとSpring-MVCでJsonにオブジェクトのリストをシリアライズ
- 12. jacksonは参照されたオブジェクトフィールドをルートにシリアライズ
- 13. @JsonTypeInfoプロパティはPOJOの逆シリアル化時に無視される
- 14. Jackson JAXRSプロバイダを使用してDynaBeanのLazyDynaListをシリアライズ
- 15. Entity Frameworkでの更新時に列を無視する
- 16. VB.NETコンパイル時に不正な参照を無視する
- 17. シリアル化時にナビゲーションプロパティを無視する方法
- 18. ジョブの作成時にSQLエラーを無視する
- 19. SVN:コミット時に外部を無視する
- 20. ファブリック:-Hオプション使用時にenv.hostsを無視する
- 21. 追加時に不明な値を無視する
- 22. SVN:更新時にファイルをローカルで無視する
- 23. ネストされたRailsモデル - 作成時にchild_indexを無視する
- 24. Jqueryオートコンプリートで検索時にダッシュを無視する
- 25. ruby/rails注文時にコンマを無視する方法
- 26. データコントラクト:デシリアライズ時に不明な型を無視する
- 27. FossilSCM、追加時にファイルを無視する
- 28. CSS:フローティング時にdivsの高さを無視する
- 29. プロパティを無視しているジャクソンライブラリ
- 30. string.text.containsの使用時に無視する方法は?
ご回答ありがとうございます。私は実際、コンポジションベースのアプローチに移行することを検討していました。 'LinkedHashMap'は実際に私のモデルクラスの直接スーパークラスではありません。代わりに、MongoDBの 'BasicDBObject'を拡張して、簡単に永続化させることができます。しかし、私はあまりにも多くの目的のためにこれらのオブジェクトを使用しようとしている可能性があります。 toDBObject()メソッドとfromDBObject()メソッドを追加するとうまくいくはずです。しかし、Jacksonがデフォルトの 'Map'シリアル化をやってしまうのを防ぐ方法があるかどうかは、まだ不思議です。特定のタイプのシリアライザを無効にする方法はありますか? – gilby