这是一些使用的示例代码gson https://github.com/google/gson反序列化 JSON 数据:
一、控制器类:
package gson;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import com.google.gson.Gson;
public class GsonMain {
public static void main(String[] args) throws IOException {
Gson gson = new Gson();
byte[] jsonBytes = Files.readAllBytes(Paths.get("./src/main/java/gson/jsonData.json"));
String json = new String(jsonBytes);
// Deserialization
ToJson result = gson.fromJson(json, ToJson.class);
System.out.println("RESULTS: "+result.toString());
}
}
接下来是数据模型类。这是顶级对象:
package gson;
public class ToJson {
private String zipCode;
private String name;
private Partner partner;
private BonusType bonusType;
public String getZipCode() {
return zipCode;
}
public void setZipCode(String zipCode) {
this.zipCode = zipCode;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Partner getPartner() {
return partner;
}
public void setPartner(Partner partner) {
this.partner = partner;
}
public BonusType getBonusType() {
return bonusType;
}
public void setBonusType(BonusType bonusType) {
this.bonusType = bonusType;
}
@Override
public String toString() {
return "ToJson [zipCode=" + zipCode + ", name=" + name + ", partner=" + partner + ", bonusType=" + bonusType
+ "]";
}
}
这是合作伙伴:
package gson;
import java.util.List;
import java.util.Map;
public class Partner {
private String from;
private String accountNumber;
private List<Map<String, String>> accountInfo;
public String getFrom() {
return from;
}
public void setFrom(String from) {
this.from = from;
}
public String getAccountNumber() {
return accountNumber;
}
public void setAccountNumber(String accountNumber) {
this.accountNumber = accountNumber;
}
public List<Map<String, String>> getAccountInfo() {
return accountInfo;
}
public void setAccountInfo(List<Map<String, String>> accountInfo) {
this.accountInfo = accountInfo;
}
@Override
public String toString() {
return "Partner [from=" + from + ", accountNumber=" + accountNumber + ", accountInfo=" + accountInfo + "]";
}
}
最后,这是 BonusType:
package gson;
public class BonusType {
private String code;
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
@Override
public String toString() {
return "BonusType [code=" + code + "]";
}
}
为了使 gson 成功反序列化,必须为类成员变量定义适当的 setter 方法,并且每个类必须有一个零参数构造函数(当没有显式定义构造函数时,这是隐含的)。我还定义了toString
每个方法都可以轻松读取输出。
请注意,Partner
类使用一个private List<Map<String, String>> accountInfo;
代表帐户信息数据。由于 JSON 数组中的每个对象都有一个“键”和“值”,gson 能够将它们解析为Map
对象。您可以将它们表示为自定义对象,但这不是必需的。
最后一些想法:
我不确定为什么你将 BonusType 表示为一个对象,因为它只有一个字段。您可以简单地将其表示为顶级对象中的单个名称值对:"bonusType":"credit"
这样做有意义吗?
大多数情况下是的。当您拥有复杂的数据结构时,使用代表数据模型的类通常是一个好主意。另一种方法是使用更通用的类和对象来解析数据,但这往往会导致代码更长、可读性较差、可维护性较差。此外,大多数现代 IDE 都可以快速生成类似上述的数据模型类。我只花了几分钟就在 Eclipse 中生成了这些内容。你基本上只需要定义类成员变量,其余的很容易生成,这节省了你的时间。
另一方面,大多数解析器在反序列化 JSON 数据时会忽略额外的字段,这意味着每当需要新字段时都必须更新对象。如果您将数据表示为Map<String,Object>
相反,解析器将能够提取所有字段。这就是为什么哪种解析方法最好取决于您的用例。如果您希望经常向 JSON 添加新字段,那么使用更通用的数据表示形式可能会减少维护工作。但是,如果您经常更改 JSON 的现有结构,或者不期望 JSON 发生太大变化,那么自定义对象方法可能需要较少的维护。