2017-05-09 98 views
0

我必须将此JSONObject映射到Java对象中。 这是我的JSON:如何在Java对象中映射JSONObject

{"WALLET":{ 
      "ID":"1234", 
      "BAL":"20.000", 
      "NAME":"Filomena", 
      "EMAIL":"[email protected]", 
      "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; 
} 

现在,我试图映射与GSON库的对象。

Wallet walletDetails=gson.fromJson(rispostaGetWalletDetails.toString(), Wallet.class); 
    System.out.println("Balance: "+walletDetails.getBal()); 

现在,当我尝试对对象调用方法时,我始终为空而不是真正的值。 我该怎么办?

+0

你试过输出吗?的System.out.println(walletDetails); – Dezigo

+0

是的,有字符串 – Filomena

+0

是不是gson区分大小写?你有没有试过把你的json改成小写? – JSantos

回答

4

您的根级别错误。 也许,你需要需要获得下一层

JSONObject yourObject = json.get("WALLET"); 
Wallet walletDetails = gson.fromJson(yourObject.toString(), Wallet.class); 
+0

优秀的答案。 –

+0

非常感谢你! – Filomena

+0

伟大的直觉,我错过了!无论如何,我认为它仍然不会处理Java和JSON之间的字段名称不匹配。请参阅我的答案以获得澄清。 – polaretto

0

对象变量名称不匹配的JSON属性名。 json中的“EMAIL”应该具有相同的EMAIL对象。为了克服这个问题,你可以在你的属性声明之前提到@JsonProperty。

为如:

@JsonProperty( “EMAIL”) 私人字符串电子邮件;

0

要让GSON处理正确的字段名称映射反序列化,你必须注册一个FieldNamingStrategy这样的(使用Java 8):

Gson gson = new GsonBuilder() 
      .setFieldNamingStrategy(field -> field.getName().toUpperCase()) 
      .create(); 

会相互转换的Java字段名的策略,以匹配您的JSON。 这将覆盖几乎所有的字段,除了那些在JSON响应中的上层骆驼,例如“LastName”,“CompanyName”等。为了映射这些字段,您的FieldNamingStrategy必须变得更智能一些,如:

field -> { 
    String fname = field.getName(); 
    return "firstName".equals(fname) || "companyName".equals(fname) /*etc...*/ ? capitalize(fname) : fname.toUpperCase(); 
} 

等等,我想你有这个想法。 您可以在像Apache Commons Lang这样的图书馆中找到capitalize()方法,或者编写自己的方法,仅供参考。

+0

也许我会收到小写json,现在它与Dezigo的答案一起工作。不管怎样,谢谢你。 – Filomena

+0

不客气,但我不明白它是如何为你使用普通的Gson实例工作的......我尝试了使用JSON和类进行快速测试,并且它不会将字段与默认的Gson设置进行映射,我错过了什么?对你有好处,如果它有效,我只是不明白:) – polaretto