2012-09-27 72 views
3

我想通過使用Gson解析Json到Java,但是當我使用fromJson()時,我總是得到null。誰能爲我解釋這個數據結構?謝謝!這個JSON的數據結構是什麼?

{ 
"d": { 
    "results": [ 
     { 
      "__metadata": { 
       "uri": "https://api.datamarket.azure.com/Data.ashx/Bing/SearchWeb/v1/Web?Query='bill'gates'&$skip=0&$top=1", 
       "type": "WebResult" 
      }, 
      "ID": "9bd0942f-fe5b-44fc-8343-ef85e5b93a7e", 
      "Title": "The Official Site of Bill Gates - The Gates Notes", 
      "Description": "In the space between business and goverment, even a small investment can make a big impact on the lives of those in need.", 
      "DisplayUrl": "www.thegatesnotes.com", 
      "Url": "http://www.thegatesnotes.com/" 
     }, 
     { 
      "__metadata": { 
       "uri": "https://api.datamarket.azure.com/Data.ashx/Bing/SearchWeb/v1/Web?Query='bill'gates'&$skip=1&$top=1", 
       "type": "WebResult" 
      }, 
      "ID": "fdf0d3b9-b29f-43ef-b5ba-6bb4b1b04458", 
      "Title": "Bill Gates - Wikipedia, the free encyclopedia", 
      "Description": "William Henry \"Bill\" Gates III (born October 28, 1955) is an American business magnate and philanthropist. Gates is the former chief executive and current chairman of ...", 
      "DisplayUrl": "en.wikipedia.org/wiki/Bill_Gates", 
      "Url": "http://en.wikipedia.org/wiki/Bill_Gates" 
     } 
    ], 
    "__next": "https://api.datamarket.azure.com/Data.ashx/Bing/SearchWeb/v1/Web?Query='bill'gates'&$skip=10&$top=10" 
} 

}

我認爲數據結構應該是這樣的,但它不工作。

public class d { 
    public result[] results; 
    public String __next;} 

public class result { 
    public information[] infolist;} 

public class information { 
    public __metadata metadata; 
    public String ID; 
    public String Title; 
    public String Description; 
    public String DisplayUrl; 
    public String Url;} 

public class __metadata { 
    public String uri; 
    public String type;} 
+1

也許它更容易構造對象d與上面的數據和序列化它使用GSON到JSON和比較。 – gigadot

+0

@ gigadot一個好的調試方法,它會很快突出顯示問題:) – Brian

回答

3

您的Information類是問題。將Information填入Result並從Result中刪除infolist。此外,元數據的字段名稱是__metadata。這不是課程名稱。最後,您錯過了將d作爲字段包裝的類。

public class DataContainer { 
    public Data d; 
} 

public class Data { 
    public Result[] results; 
    public String __next; 
} 

public class Result { 
    public Metadata __metadata; 
    public String ID; 
    public String Title; 
    public String Description; 
    public String DisplayUrl; 
    public String Url; 
} 

public class Metadata { 
    public String uri; 
    public String type; 
} 

你真的應該對類名使用通用約定。 Gson不會排除你將自己的名字用於課程。它只需要控制字段的名稱。

反序列化:

String json = ... ; 
DataContainer myDataContainer = new Gson().fromJson(JSONString , DataContainer.class); 
Result[] myResult = myDataContainer.d.results; 

試一下,看看是否可行。

這裏是你應該如何解釋,當你寫它周圍的類結構GSON的JSON:

  • 一開口{指示對象,因此這將是一個新的類(或現有的一個,如果它們具有相同的字段)
  • A "this":指示其內部對象的字段,並且該字段必須與字符串中的文本命名爲相同的東西。
  • 開口[指示數組,ListSetResult[] results可以很容易地被List<Result> results
+0

我嘗試過,但仍然得到空。 D myD = new Gson()。fromJson(JSONString,D.class);結果[] myResult = myD.results;我沒有得到任何東西:( –

+0

是的,這很有用!非常感謝。因爲在'd'之前有一個'{',所以我們應該設置一個包含'd'的類。 –

+0

這是因爲有一個初始開放' ''我們忘記了,這表示一個對象的開始,''d「'是該對象內的一個字段。對不起,我和Gson一起工作了幾個月,所以我完全錯過了。 – Brian