2011-10-13 154 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)。

对不起,但在这一刻我无法正确地尝试这一点。