17

我想将 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.
4

3 回答 3

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

你为什么不只使用一个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
于 2013-11-08T19:31:26.193 回答
0

将注解放在IBar接口声明而不是字段上,即:

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