如何在Java对象中映射JSONObject
我必须将这个JSONObject映射到Java对象中。 这是我的Json:如何在Java对象中映射JSONObject,java,json,Java,Json,我必须将这个JSONObject映射到Java对象中。 这是我的Json: {"WALLET":{ "ID":"1234", "BAL":"20.000", "NAME":"Filomena", "EMAIL":"filo@gmail.com", "DOCS":[ { "ID":"001",
{"WALLET":{
"ID":"1234",
"BAL":"20.000",
"NAME":"Filomena",
"EMAIL":"filo@gmail.com",
"DOCS":[
{
"ID":"001",
"S":"0",
"TYPE":"CardId",
"VD":"2019"
}
],
"IBANS":[
{
"ID":"001",
"S":"1",
"DATA":"iban",
"SWIFT":"swiftCode",
"HOLDER":"holder"
}
],
"STATUS":"string",
"BLOCKED":"1",
"SDDMANDATES":[
{
"ID":"sddMandateId",
"S":"status",
"DATA":"iban",
"SWIFT":"swiftCode"
}
],
"LWID":"string",
"CARDS":[
{
"ID":"string",
"EXTRA":{
"IS3DS":"string",
"CTRY":"string",
"AUTH":"string",
"NUM":"string",
"EXP":"string",
"TYP":"string"
}
}
],
"FirstName":"string",
"LastName":"string",
"CompanyName":"string",
"CompanyDescription":"string",
"CompanyWebsite":"string"
}
}
这是我的Java类:
public class Wallet {
private String id;
private String bal;
private String name;
private String email;
private List<Doc> docs;
private List<Iban> ibans;
private String status;
private String blocked;
private List<SddMandate> sddMandates ;
private String lwid;
private List<Card> cards;
private String firstName;
private String lastname;
private String companyName;
private String companyDescription;
private String companyWebSite;
public Wallet(){
}
public Wallet(String id, String bal, String name, String email, List<Doc> docs, List<Iban> ibans, String status,
String blocked, List<SddMandate> sddMandates, String lwid, List<Card> cards, String firstName,
String lastname, String companyName, String companyDescription, String companyWebSite) {
super();
this.id = id;
this.bal = bal;
this.name = name;
this.email = email;
this.docs = docs;
this.ibans = ibans;
this.status = status;
this.blocked = blocked;
this.sddMandates = sddMandates;
this.lwid = lwid;
this.cards = cards;
this.firstName = firstName;
this.lastname = lastname;
this.companyName = companyName;
this.companyDescription = companyDescription;
this.companyWebSite = companyWebSite;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getBal() {
return bal;
}
public void setBal(String bal) {
this.bal = bal;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public List<Doc> getDocs() {
return docs;
}
public void setDocs(List<Doc> docs) {
this.docs = docs;
}
public List<Iban> getIbans() {
return ibans;
}
public void setIbans(List<Iban> ibans) {
this.ibans = ibans;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
public String getBlocked() {
return blocked;
}
public void setBlocked(String blocked) {
this.blocked = blocked;
}
public List<SddMandate> getSddMandates() {
return sddMandates;
}
public void setSddMandates(List<SddMandate> sddMandates) {
this.sddMandates = sddMandates;
}
public String getLwid() {
return lwid;
}
public void setLwid(String lwid) {
this.lwid = lwid;
}
public List<Card> getCards() {
return cards;
}
public void setCards(List<Card> cards) {
this.cards = cards;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastname() {
return lastname;
}
public void setLastname(String lastname) {
this.lastname = lastname;
}
public String getCompanyName() {
return companyName;
}
public void setCompanyName(String companyName) {
this.companyName = companyName;
}
public String getCompanyDescription() {
return companyDescription;
}
public void setCompanyDescription(String companyDescription) {
this.companyDescription = companyDescription;
}
public String getCompanyWebSite() {
return companyWebSite;
}
public void setCompanyWebSite(String companyWebSite) {
this.companyWebSite = companyWebSite;
}
现在,当我尝试调用对象上的方法时,我总是使用null,而不是实际值。
我该怎么办?您的根级别错误。 也许,你需要降一级
JSONObject yourObject = json.get("WALLET");
Wallet walletDetails = gson.fromJson(yourObject.toString(), Wallet.class);
你有一个错误的根级别。 也许,你需要降一级
JSONObject yourObject = json.get("WALLET");
Wallet walletDetails = gson.fromJson(yourObject.toString(), Wallet.class);
您的对象变量名称与json属性名称不匹配。json中的“EMAIL”在对象中应该有相同的EMAIL。为了克服这个问题,可以在属性声明之前提到@JsonProperty 例如: @JsonProperty(“电子邮件”)
私人字符串电子邮件 对象变量名与json属性名不匹配。json中的“EMAIL”在对象中应该有相同的EMAIL。为了克服这个问题,可以在属性声明之前提到@JsonProperty 例如: @JsonProperty(“电子邮件”)
私人字符串电子邮件 要让Gson在反序列化时处理正确的字段名映射,您必须像这样注册
FieldNamingStrategy
(使用Java 8):
该策略将转换每个Java字段名以匹配JSON中的字段名。
这将覆盖几乎所有的字段,除了JSON响应中的大写字段,如“LastName”、“CompanyName”等。为了映射这些字段,您的FieldNamingStrategy必须变得更加智能,如:
field -> {
String fname = field.getName();
return "firstName".equals(fname) || "companyName".equals(fname) /*etc...*/ ? capitalize(fname) : fname.toUpperCase();
}
等等,我想你知道了。
capitalize()
方法可以在Apache Commons Lang之类的库中找到,也可以编写自己的方法,这里仅作示例。要让Gson在反序列化时处理正确的字段名映射,必须注册一个FieldNamingStrategy
,如下所示(使用Java 8):
该策略将转换每个Java字段名以匹配JSON中的字段名。
这将覆盖几乎所有的字段,除了JSON响应中的大写字段,如“LastName”、“CompanyName”等。为了映射这些字段,您的FieldNamingStrategy必须变得更加智能,如:
field -> {
String fname = field.getName();
return "firstName".equals(fname) || "companyName".equals(fname) /*etc...*/ ? capitalize(fname) : fname.toUpperCase();
}
等等,我想你知道了。
capitalize()
方法可以在ApacheCommonsLang之类的库中找到,也可以编写自己的方法,这里仅作示例。您尝试过输出吗?系统输出打印LN(walletDetails);是的,有一个字符串gson不区分大小写吗?您是否尝试将json更改为小写?是否尝试输出?系统输出打印LN(walletDetails);是的,有一个字符串gson不区分大小写吗?你试过把json改成小写吗?直觉很好,我错过了!无论如何,我认为它仍然不能处理Java和JSON之间的字段名不匹配问题。请看我的答案以获得澄清。伟大的直觉,我错过了!无论如何,我认为它仍然不能处理Java和JSON之间的字段名不匹配问题。请参阅我的答案以获得澄清。也许我会收到小写json,因为现在它与Dezigo的答案一起工作。不管怎样,谢谢你。不客气,但我不明白如何使用普通的Gson实例为你工作。。。我尝试了一个使用JSON和类的快速测试,但它无法用默认的Gson设置映射字段,我是否遗漏了什么?如果它能工作,对你有好处,我只是不知道如何:)也许我会收到小写的json,因为现在它可以与Dezigo的答案一起工作。不管怎样,谢谢你。不客气,但我不明白如何使用普通的Gson实例为你工作。。。我尝试了一个使用JSON和类的快速测试,但它无法用默认的Gson设置映射字段,我是否遗漏了什么?对你有好处如果它有效,我只是不知道如何:)