2017-05-09 100 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