使用嵌套类将JSON转换为POJO

时间:2019-02-07 20:08:07

标签: java json jackson inner-classes

我从数据提供者处接收了一些String格式的JSON,据我了解,我可以使用类文件将JSON转换为POJO。数据提供程序提供了@JsonProperty类,我已经设法使用这些类将JSON转换为POJO。我的问题是,是否可能只有一个包含所有@JsonProperty类的嵌套Java类?而不是拥有很多单独的类。

Json字符串:

{
    "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。之所以这是一个理想的解决方案,是因为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 :(得分:1)

您理想的解决方案应该起作用。唯一缺少的是使内部类静态化。它们必须是静态的,以便您的JSON解串器可以实例化它们,而无需将它们附加到现有的JSONSorter实例。