2011-10-13 146 views
3

我試圖解析使用GSON以下JSON字符串在我的Android應用:未能反序列化JSON對象

{"Links":[{"Name":"Facebook","URL":"http://www.facebook.com/"},{"Name":"Twitter","URL":"http://twitter.com/"},{"Name":"Last FM","URL":"http://www.last.fm/"},{"Name":"Hyves","URL":"http://hyves.nl"},{"Name":"My Space","URL":"http://www.myspace.com/"},{"Name":"YouTube","URL":"http://www.youtube.com/"}]} 

做這件事時,GSON給了我以下異常:

10-13 11:09:23.103: DEBUG/Error:(752): The JsonDeserializer [email protected]30 failed to deserialize json object 
{"Links":[{"Name":"Facebook","URL":"http://www.facebook.com/"},{"Name":"Twitter","URL":"http://twitter.com/"},{"Name":"Last FM","URL":"http://www.last.fm/"},{"Name":"Hyves","URL":"http://hyves.nl"},{"Name":"My Space","URL":"http://www.myspace.com/"},{"Name":"YouTube","URL":"http://www.youtube.com/"}]} 
given the type java.util.List<com.sander.app.json.links.Links> 

現在我對JSON來說是一個完全新手,所以我很確定我必須做錯什麼。

我使用這個方法來解析我JSON:

 WebService webService = new WebService("http://*********/GetLinksData"); 

     //Pass the parameters 
     Map<String, String> params = new HashMap<String, String>(); 
     params.put("iAppID", "59"); 
     params.put("iFormID", "461"); 

     //Get JSON response from server the "" are where the method name would normally go if needed example 
     // webService.webGet("getMoreAllerts", params); 
     String response = webService.webGet("", params); 
     System.out.println("Returns: "+response); 

     try 
     { 
      //Parse Response into our object 
      Type collectionType = new TypeToken<List<Links>>(){}.getType(); 
      List<Links> alrt = new Gson().fromJson(response, collectionType); 


     } 
     catch(Exception e) 
     { 
      Log.d("Error: ", e.getMessage()); 
     } 
} 

這是我的鏈接類:

public class Links { 


public String Name; 


public String URL; 

public Links(String name, String URL){ 
    this.Name = name; 
    this.URL = URL; 
} 

@Override 
public String toString(){ 
    return "Name: " + Name + "URL: " + URL; 
}} 

我怎麼可能可以解決這個問題?我已經堅持了兩天,即使我想學習如何自己解決這些問題,但我的選擇已經不多了。

問候,

桑德

=================================== ================

與Raunak的幫助修正:

公共類LinkStorer { 公共鏈接,友情鏈接[];

public Link[] getLinks(){ 
    return Links; 
} 

public Link getSingleLink(int i){ 
    return Links[i]; 
} 

public static class Link { 
    public String Name; 
    public String URL; 

    public String getName() { 
     return Name; 
    } 

    public String getURL() { 
     return URL; 
    } 
}} 

徵集JSON對象:

LinkStorer collection = new Gson().fromJson(response, LinkStorer.class); 
      for(int i=0; i < collection.Links.length; i++){ 
       System.out.println(collection.getSingleLink(i).getName()); 

回答

1

您有關於製作的鏈接一個單獨的類,但正確的觀念,它應該是這個樣子

public class Type { 
    public Link Links[]; 

    public static class Link { 
     public String Name; 
     public String URL; 

     public String getName() { 
      return Name; 
     } 

     public String getURL() { 
      return URL; 
     } 
    } 
} 

然後,您可以將您的JSON字符串轉換成Java對象是這樣的:

Type collection = new Gson().fromJson(response, Type.class); 
+0

你,我的好人,是一個現場救星! 我的最終修復是在開始帖子中。 –

+0

我的壞,一般來說還是新的。以爲我點擊它,但猜測我沒有。不過謝謝你! –

0

也許GSON只能反序列化JSON對象的標準Java類型?在你的情況下,它可能是一些像List<HashMap<String, List<String>>>。一旦你有了這個,你可以迭代本地Java對象來生成你的自定義對象。

+0

真的嗎?因爲我正在關注[本教程](http://www.josecgomez。com/2010/04/30/android-accessible-restfull-web-services-using-json /),它也使用自定義對象,並且工作得很好。 –

+0

我不知道,這是一個很長的例子:)。 – SK9

1

也許這個問題,當你定義JSON輸入的格式。您的程序需要以下JSON。

[{"Name":"Facebook","URL":"http://www.facebook.com/"},{"Name":"Twitter","URL":"http://twitter.com/"},{"Name":"Last FM","URL":"http://www.last.fm/"},{"Name":"Hyves","URL":"http://hyves.nl"},{"Name":"My Space","URL":"http://www.myspace.com/"},{"Name":"YouTube","URL":"http://www.youtube.com/"}] 

嘗試創建另一個POJO

public class LinksSearchResult { 

private List<Links> links; 

public List<Links> getLinks() { 
    return links; 
} 

} 

而且使用fromJSON這樣

LinksSearchResult鏈接=新GSON()fromJson(響應,collectionType)。

對不起,但在這一刻我無法正確地嘗試這一點。