Jacksonのカスタムシリアライザとデシリアライザの作成方法

私には十数以上の特性を持つクラスがあります。プリミティブ型のほとんどのプロパティについては、デフォルトのBeanSerializerとBeanDeserializerなどを使用して、書く必要のある面倒なコードを減らしたいと考えています。カスタムおよび配列型の他のプロパティについては、カスタムのシリアライザ/デシリアライザを使用したいと思います。基になるJSON文字列を変更することはできません。しかし、私はアンドロイドコードに完全にアクセスできます。私はJackson 1.7.9/Ektorp 1.1.1を使用しています。

BeanDeserializerをサブクラス化しますか?私はそれに問題があります。パラメータを持たないデフォルトのコンストラクタが必要ですが、スーパーコンストラクタの呼び出し方法はわかりません。

class MyType{
   //a dozen properties with primitive types String, Int, BigDecimal
    public Stirng getName();
    public void setName(String name);

   //properties that require custom deserializer/serializer
    public CustomType getCustom();
    public void setCustom(CustomType ct);
}

class MyDeserializer extends BeanDeserialzer{
   //an exception is throw if I don't have default constructor.
   //But BeanDeserializer doesn't have a default constructor
   //It has the below constructor that I don't know how to fill in the parameters
    public MyDeserializer(AnnotatedClass forClass, JavaType type,
        BeanProperty property, CreatorContainer creators,
        BeanPropertyMap properties,
        Map backRefs,
        HashSet ignorableProps, boolean ignoreAllUnknown,
        SettableAnyProperty anySetter) {
    super(forClass, type, property, creators, properties, backRefs, ignorableProps,
            ignoreAllUnknown, anySetter);
}
    @Override
    public Object deserialize(JsonParser jp, DeserializationContext dc, Object bean)
        throws IOException, JsonProcessingException {
    super.deserialize(jp, dc, bean);
        MyType c = (MyType)bean;        

            ObjectMapper mapper = new ObjectMapper();

            JsonNode rootNode = mapper.readValue(jp, JsonNode.class);
           //Use tree model to construct custom
           //Is it inefficient because it needs a second pass to the JSON string to construct the tree?
            c.setCustom(custom);
            return c;
}
}

Googleを検索しましたが、役立つサンプル/チュートリアルが見つかりませんでした。誰かが私に偉大になるいくつかの実用的な例を私に送ることができれば!ありがとう!

7

1 答え

BeanSerializer/-Deserializerをサブクラス化するには、インスタンスの構成を変更できるBeanSerializerModifierおよびBeanDeserializerModifierによる明示的サポートによってこの領域が改善されたため、より新しいバージョンのJacksonを使用する方がよいでしょう。

しかし、確かめるために、カスタムのシリアライザ/デシリアライザを指定して、個々のプロパティで使用することもできます:

class Foo {
   @JsonSerialize(using=MySerializer.class)
   public OddType getValue();
}
4
追加された
1.8よりも優先度が高いため、実際に動作する可能性があります。 BeanSerializerModifierを使用すると、実際にBeanSerializerをオーバーライドする必要はありませんが、カスタムインスタンスを作成することもできますが、他のプロンプトをデフォルト設定に戻すこともできます。また、カスタムシリアライザは、 'resolve()'メソッド(BeanSerializerと同様に、ResolvableSerializerを実装する場合)でデフォルトのものを検索できます。可能であれば、BeanSerializersをサブクラス化することを避けるのが理想です。サブクラスにする必要がある場合は、それもサポートされているテクニックです。
追加された 著者 StaxMan,
手作業でアンラップするのは難しいです。とBean(De)SerializerModifierは、高度なユースケースです。がんばろう!
追加された 著者 StaxMan,
その通りその通り。タイプミスを修正しました。
追加された 著者 StaxMan,
これは@JsonSerialize(最後にrはありません)のように見えます。
追加された 著者 Frans,
アイデアありがとう!私はそれが動作するかどうかを見るためにそれを試してみます。私はAndroid用のEktorpを使用しています。彼らは1.1.1を提案しています。そのため、私はJackson 1.7.9を使用しています。しかし、アップグレードすれば動作するかもしれません。
追加された 著者 PokerIncome.com,
私が行える最高のバージョンは1.8.5です。なにか提案を?私はあなたのJsonSerializerのアイデアをOddTypeで試してみます。
追加された 著者 PokerIncome.com,
もう一度考えてくれてありがとう!私は基本的にJsonUnwrapped(1.9の機能)を実装したいと思う1.8.5とシリアライズ/デシリアライズ。最も簡単な方法は何ですか?私はBeanSerializerModifierの使い方を理解するのが難しいです。あなたは例や文書がありますか?どうもありがとう!
追加された 著者 PokerIncome.com,
このサンプルを使用して、JsonDeserializer を拡張して、すべてのプロパティを自分自身で逆シリアル化します。書き込むのが面倒だと思うが、それが私が今知っている唯一の方法だ! javasourcecode.org/html/open-source/jackson/jackson-1.8.5/or‌ g /…
追加された 著者 PokerIncome.com,
JavaScript - 日本のコミュニティ
JavaScript - 日本のコミュニティ
2 参加者の

日本人コミュニティのjavascript