反序列化列表<界面>与杰克逊

2022-09-02 20:23:32

我想将json反序列化为类Foo:

class Foo {
   List<IBar> bars;
}

interface IBar {
   ...
}

class Bar implements IBar {
   ...
}

IBar 有两个实现,但在反序列化时,我总是希望使用第一个实现。(理想情况下,这应该使问题更容易,因为不需要运行时类型检查)

我相信我可以写自定义的反序列化器,但觉得一定有更简单的东西。

我发现了这个注释,当没有列表时,它可以完美地工作。

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

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

答案 1
@JsonDeserialize(contentAs=Bar.class)
List<IBar> bars;

答案 2

你为什么不直接使用一个?TypeReference

例如。。。

Json 文件:test.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