Полиморфная десериализация Джексона со свойством вложенного типа - PullRequest
0 голосов
/ 26 апреля 2019

Моя цель - десериализовать следующий json в правильный подкласс на основе поля типа в атрибутах:

{
  "totalSize": 1,
  "done": true,
  "records": [
    {
      "attributes": {
        "type": "Custom_Object__c",
        "url": "\/services\/data\/v44.0\/sobjects\/Custom_Object__c\/a00Y000000fM1CzUFZ"
      },
      "Name": "Name Test",
      "Price_Out__c": false,
      "Description__c": "This is a sample description!",
      "Ticket_Number__c": "AM-12345"
    }
  ]
}

Мой класс верхнего уровня - QueryResult.java:

public class QueryResult {
    private String totalSize;
    private Boolean done;

    @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "type")
    @JsonSubTypes(value = {
            @JsonSubTypes.Type(value = Custom_Object__c.class, name = "Custom_Object__c")
    })
    private List<Records> records = new ArrayList<>();

    public String getTotalSize() {
        return totalSize;
    }

    public void setTotalSize(String totalSize) {
        this.totalSize = totalSize;
    }

    public Boolean getDone() {
        return done;
    }

    public void setDone(Boolean done) {
        this.done = done;
    }

    public List<Records> getRecords() {
        return records;
    }

    public void setRecords(List<Records> records) {
        this.records = records;
    }
}

Recordss.java:

public abstract class Records {
    private Attributes attributes;

    public Attributes getAttributes() {
        return attributes;
    }

    public void setAttributes(Attributes attributes) {
        this.attributes = attributes;
    }
}

CustomObject.java:

public class ManagedOrg extends Records {
    private String Name;
    private String Price_Out__c;
    private String Description__c;
    private String Ticket_Number__c;

    public String getName() {
        return Name;
    }

    public void setName(String name) {
        Name = name;
    }

    public String getPrice_Out__c() {
        return Price_Out__c;
    }

    public void setPrice_Out__c(String price_Out__c) {
        Price_Out__c = price_Out__c;
    }

    public String getDescription__c() {
        return Description__c;
    }

    public void setDescription__c(String description__c) {
        Description__c = description__c;
    }

    public String getTicket_Number__c() {
        return Ticket_Number__c;
    }

    public void setTicket_Number__c(String ticket_Number__c) {
        ticket_Number__c = Ticket_Number__c;
    }
}

Я не могу заставить это работать.Свойство идентификации вкладывается в список записей:

"records": [
{
  "attributes": {
    "type": "Custom_Object__c",

Возможно ли, чтобы Джексон использовал это значение в качестве JsonTypeId?Я думал, что мои вышеупомянутые аннотации решат это, но я получаю сообщение об ошибке, в котором говорится, что мне не хватает свойства type для класса Records.Это потому, что свойство type находится внутри самого класса Records?

...