2011-02-12 71 views
4

我最近開始使用GSON庫來反序列化來自web服務的JSON,但我無法使其工作。我決定在一些簡單的輸入上測試GSON - 不能使它更簡單,但它仍然不起作用。我查看了類似的問題,例如Converting JSON to Java,所有這些都提供了類似的解決方案。我的猜測是我錯過了一些非常簡單明顯的東西,因此對代碼的全新觀點可能會有所幫助。 因此,這裏是我:簡單的Json到使用GSON的Java轉換

JSON

{"A":{"name":"qwrety","value1":1,"value2":2}} 

Java類

import com.google.gson.Gson; 

public class Main { 

    public static void main(String[] args) {   
     String json = /*getting JSON from server*/  
     Gson gson = new Gson(); 
     A obj = gson.fromJson(json, A.class); 
     System.out.println(obj); 
    } 
} 

class A { 
    private String name; 
    private int value1; 
    private int value2; 

    public String getName() { return name; } 
    public int getValue1() { return value1; } 
    public int getValue2() { return value2; } 

    public void setName(String name) { this.name = name; } 
    public void setValue1(int value1) { this.value1 = value1; } 
    public void setValue2(int value2) { this.value2 = value2; } 

    public String toString() { 
     return String.format("name: %s, value1: %d, value2: %d", name, value1, value2); 
    } 
} 

我得到的回報是

name: null, value1: 0, value2: 0 

任何人都可以告訴什麼是錯的這個碼?

UPD 由於@torbinsky和@ Kevin-Dolan指出,問題是因爲Java類結構與Json格式不匹配。爲了解決這個問題,我添加一個新的類

class Container { 
    private A a; 

    public A getA() { return a; } 

    public void setA(A a) { this.a = a; } 

} 

,改變了deserialisation調用以下

Gson gson = new Gson(); 
Container obj = gson.fromJson(json, Container.class); 

System.out.println(obj.getA()); 

不過,我反正得「空」打印出來

回答

4

我覺得你的問題是你的JSON字符串。

嘗試改變:

{"A":{"name":"qwrety","value1":1,"value2":2}} 

到:

{"name":"qwrety","value1":1,"value2":2} 

編輯: 我想問題可能是你的JSON字符串有 「A」,這是區分大小寫的。嘗試將您的成員變量更改爲大寫字母「A」。對不起,我目前無法測試以確認這一點。

如果JSON格式是固定的,然後試着改變你的類類似的東西:

class Foo { 
private String name; 
private int value1; 
private int value2; 

public String getName() { return name; } 
public int getValue1() { return value1; } 
public int getValue2() { return value2; } 

public void setName(String name) { this.name = name; } 
public void setValue1(int value1) { this.value1 = value1; } 
public void setValue2(int value2) { this.value2 = value2; } 

public String toString() { 
    return String.format("name: %s, value1: %d, value2: %d", name, value1, value2); 
} 
} 

和:

class Container { 
private Foo A; 

public Foo getA() { return A; } 

public void setA(Foo A) { this.A = A; } 
} 
+0

謝謝,您是對的,將json改爲您建議的作品,但正如我所說的,我從Web服務獲取json,所以我無法真正改變它的格式。你的回答給了我一個想法來引入新的課程 - > class Container {a} public A getA(){return a; } public void setA(A a){this.a = a; } } 並反序列化它 - > Container obj = gson.fromJson(json,Container.class); 但是,當我打印obj.getA()我仍然得到空 – IvanR 2011-02-13 00:17:52

2

的問題是,它在尋找所謂的「A在你的對象字段「,而是找到字段」名稱「,」值1「和」值2「。

你想要的JSON被髮送到GSON是:

{"name":"qwrety","value1":1,"value2":2} 
1

後的變化,你的字段名稱仍是 「一」,但JSON使用 「A」。所以你需要重新命名字段,或添加註釋來表明JSON使用「A」作爲名稱(@SerializedName(「A」))。