【问题标题】:Convert JSON to POJO using nested classes使用嵌套类将 JSON 转换为 POJO
【发布时间】:2019-02-07 20:08:07
【问题描述】:

我从数据提供者那里收到一些字符串格式的 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;
    }

}

【问题讨论】:

  • 这个解决方案有什么问题?如果需要,您可以跳过一些属性并使用 UPPER_CAMEL_CASE 命名策略 (baeldung.com/jackson-advanced-annotations),但通常这是最灵活的方法。
  • 这没什么问题,但是在我的情况下,由于使用相同的名称检索不同的数据集,因此会有数百个类。因此,根据检索到的数据,会有许多版本的“public class DataKeys{}”。我已经用理想的解决方案更新了我的帖子。希望这可以澄清。
  • 如果根据数据集可能有这么多不同的属性,恕我直言,您应该采用动态方式,而不是像HashMap<String, Object>这样的具体类型类
  • 或者,如果唯一的 DataKeys 属性是动态的并且不断变化,那么您可以考虑仅对 DataKeys 使用 HashMap,其余部分保持不变

标签: java json jackson inner-classes


【解决方案1】:

您的理想解决方案应该可行。唯一缺少的是使内部类成为静态的。它们必须是静态的,以便您的 JSON 反序列化程序可以实例化它们,而无需将它们附加到 JSONSorter 的现有实例。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-23
    • 1970-01-01
    • 1970-01-01
    • 2019-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-15
    相关资源
    最近更新 更多