Конвертировать JSON в POJO, используя вложенные классы - PullRequest
0 голосов
/ 07 февраля 2019

Я получаю JSON в формате String от поставщика данных, насколько я понимаю, я могу преобразовать JSON в POJO, используя файл класса.Поставщик данных предоставляет @JsonProperty классы, которые мне удалось использовать для преобразования JSON в POJO.У меня вопрос: возможно ли иметь только один вложенный класс Java, который содержит все классы @JsonProperty?Вместо того, чтобы иметь отдельные классы, которых много.

Json String:

{
    "BillingAccount": {
        "AccountType": "Trial",
        "AccountBalance": 999.99,
        "TransactionCost": 999.99,
        "ExtraInformation": {}
    },

    "Request": {
        "RequestGuid": "abcde",
        "PackageId": "abcde",
        "PackageVersion": 2,
        "ResponseVersion": 2,
        "DataKeys": {
            "Vrm": "example"
        }
    }
}

BillingAccount.java

public class BillingAccount
{
    @JsonProperty("AccountType")
    public String accountType;
    @JsonProperty("AccountBalance")
    public double accountBalance;
    @JsonProperty("TransactionCost")
    public double transactionCost;
    @JsonProperty("ExtraInformation")
    public ExtraInformation extraInformation;
}

DataKeys.java

public class DataKeys
{
    @JsonProperty("Vrm")
    public String vrm;
}

Request.java

public class Request
{
    @JsonProperty("RequestGuid")
    public String requestGuid;
    @JsonProperty("PackageId")
    public String packageId;
    @JsonProperty("PackageVersion")
    public int packageVersion;
    @JsonProperty("ResponseVersion")
    public int responseVersion;
    @JsonProperty("DataKeys")
    public DataKeys dataKeys;
}

POJO.java

public class POJO {

    @JsonProperty("BillingAccount")
    public JSONSorter.BillingAccount billingAccount;
    @JsonProperty("Request")
    public JSONSorter.Request request;

}

Идеальное решение:

Как вы можете видеть, есть класс JSONSorter, в котором находятся другие классы.Поэтому при создании POJO я бы назвал public JSONSorter.Request request;, а не просто запрос.Это идеальное решение, потому что класс Request может иметь разные свойства в зависимости от того, какой набор данных извлекается.Поэтому вместо того, чтобы использовать Request1, Request2, Request3, было бы лучше иметь JSONSorter1, JSONSorter2, JSONSorter3.Каждый из которых будет содержать классы, необходимые для извлечения данных.

public class JSONSorter {

    public class Request {
        @JsonProperty("RequestGuid")
        public String requestGuid;
        @JsonProperty("PackageId")
        public String packageId;
        @JsonProperty("PackageVersion")
        public int packageVersion;
        @JsonProperty("ResponseVersion")
        public int responseVersion;
        @JsonProperty("DataKeys")
        public DataKeys dataKeys;
    }

    public class DataKeys {
        @JsonProperty("Vrm")
        public String vrm;
    }

    public class BillingAccount {
        @JsonProperty("AccountType")
        public String accountType;
        @JsonProperty("AccountBalance")
        public double accountBalance;
        @JsonProperty("TransactionCost")
        public double transactionCost;
        @JsonProperty("ExtraInformation")
        public ExtraInformation extraInformation;
    }

}

1 Ответ

0 голосов
/ 08 февраля 2019

Ваше идеальное решение должно работать.Единственное, чего не хватает, это сделать статические внутренние классы.Они должны быть статическими, чтобы десериализатор JSON мог их создавать, не подключая их к существующему экземпляру JSONSorter.

...