17

json をクラス Foo にデシリアライズしたい:

class Foo {
   List<IBar> bars;
}

interface IBar {
   ...
}

class Bar implements IBar {
   ...
}

IBar には 2 つの実装がありますが、逆シリアル化するときは常に最初の実装を使用したいと考えています。(実行時の型チェックが不要なため、理想的には問題が簡単になるはずです)

カスタムデシリアライザーを作成できると確信していますが、もっと簡単なものがあるに違いないと感じました。

リストがない場合に完全に機能するこの注釈を見つけました。

@JsonDeserialize(as=Bar.class)
IBar bar;

List<IBar> bars; // Don't know how to use the annotation here.
4

3 に答える 3

33
@JsonDeserialize(contentAs=Bar.class)
List<IBar> bars;
于 2014-02-21T11:30:29.850 に答える
1

を使用しないのはなぜTypeReferenceですか?

例えば...

test.jsonのJson ファイル/your/path/:

[{"s":"blah"},{"s":"baz"}]

パッケージ内のメインクラスtest:

public class Main {
    public static void main(String[] args) {
        ObjectMapper mapper = new ObjectMapper();
        try {
            List<IBar> actuallyFoos = mapper.readValue(
                    new File("/your/path/test.json"), new TypeReference<List<Foo>>() {
                    });
            for (IBar ibar : actuallyFoos) {
                System.out.println(ibar.getClass());
            }
        }
        catch (Throwable t) {
            t.printStackTrace();
        }
    }

    static interface IBar {
        public String getS();

        public void setS(String s);
    }

    static class Foo implements IBar {
        protected String s;

        public String getS() {
            return s;
        }

        public void setS(String s) {
            this.s = s;
        }
    }

    static class Bar implements IBar {
        protected String s;

        public String getS() {
            return s;
        }

        public void setS(String s) {
            this.s = s;
        }
    }
}

メソッドの出力main:

class test.Main$Foo
class test.Main$Foo
于 2013-11-08T19:31:26.193 に答える
0

IBarフィールドではなくインターフェイス宣言に注釈を付けます。つまり、次のようになります。

@JsonDeserialize(as=Bar.class)
interface IBar {
   ...
}
于 2013-11-09T23:08:49.653 に答える