Jackson 2:无法将类型id'C'解析为test.protocol.StatusEventObject的子类型

问题描述 投票:0回答:1

获取标题上显示的异常。为什么Jackson 2库假定类型ID'C'是StatusEventObject的子类,因为我声明它是Event注释上Event的子类?

这里是课程

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "ev")
@JsonSubTypes({
    @JsonSubTypes.Type(value = ForexQuoteObject.class, name = "C"),
    @JsonSubTypes.Type(value = StatusEventObject.class, name = "status")

    }
)
public abstract class Event {

    protected String ev;

    public Event() {

    }

    public Event(String ev) {

        this.ev=ev;
    }

    public String getEv() {
        return ev;
    }

    public void setEv(String ev) {
        this.ev = ev;
    }


}


@JsonTypeName("status")
public  class StatusEventObject extends Event{

    private String status;
    private String message;


    public StatusEventObject() {

    }

    public StatusEventObject(String ev, String status, String message) {

        super(ev);
        this.status=status;
        this.message=message;
    }

    public String getStatus() {
        return status;
    }

    public void setStatus(String status) {
        this.status = status;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    @Override
    public String toString() {

        return "ev: "+ev+"\nstatus: "+status+"\nmessage: "+message;
    }
}


@JsonTypeName("C")
public class ForexQuoteObject extends Event{

    private String p;       //fx pair
    private int x;          //fx exchange ID
    private double a;       //bid
    private double b;       //ask
    private long t;         //unixtime MS

    public ForexQuoteObject() {

    }

    public ForexQuoteObject(String ev, String p, int x, double a, double b, long t) {

        super(ev);
        this.p=p;
        this.x=x;
        this.a=a;
        this.b=b;
        this.t=t;
    }

    public String getP() {
        return p;
    }

    public void setP(String p) {
        this.p = p;
    }

    public int getX() {
        return x;
    }

    public void setX(int x) {
        this.x = x;
    }

    public double getA() {
        return a;
    }

    public void setA(double a) {
        this.a = a;
    }

    public double getB() {
        return b;
    }

    public void setB(double b) {
        this.b = b;
    }

    public long getT() {
        return t;
    }

    public void setT(long t) {
        this.t = t;
    }
}

这里有两个应该反序列化的JSON示例

[{"ev":"status","status":"connected","message":"Connected Successfully"}]
[{"ev":"C","p":"GBP/USD","x":48,"a":1.24973,"b":1.24953,"t":1588361055000}]

这是我请求反序列化的方式(“ message”是JSON]

Event[] objs;
objs = mapper.readValue(message, StatusEventObject[].class);
java json jackson2
1个回答
0
投票

您应该使用基类-Event,而不是子类-StatusEventObject

mapper.readValue(jsonFile, Event[].class)
© www.soinside.com 2019 - 2024. All rights reserved.