【发布时间】: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