Джексон 2: не удалось разрешить идентификатор типа 'C' как подтип `test.protocol.StatusEventObject - PullRequest
0 голосов
/ 01 мая 2020

Получение исключения, указанного в заголовке. Почему библиотека Джексона 2 предполагает, что идентификатор типа 'C' является подклассом StatusEventObject, поскольку я утверждаю, что это подкласс события в аннотациях события?

Вот классы

@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);

1 Ответ

1 голос
/ 04 мая 2020

Вы должны использовать базовый класс - Event, вместо подкласса - StatusEventObject:

mapper.readValue(jsonFile, Event[].class)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...