使用Retrofit解析JSON

3

最近我开始使用Retrofit。关于它,我并不是很了解。我已经通过谷歌搜索来尝试解决我的问题,但都没有得到满意的答案。

这是JSON响应结果。

{
  "results": [
    {
      "description_eng": "This is second time testing",
      "img_url": "-",
      "title_eng": "Second test"
    },
    {
      "description_eng": "Hello 1 2 3, I am testing.",
      "img_url": "https://fbcdn-sphotos-f-a.akamaihd.net/hphotos-ak-xpa1/t31.0-8/s720x720/10838273_816509855058935_6428556113200361121_o.jpg",
      "title_eng": "Test"
    }
  ]
}

这是一个“Feed”类。
public class Feed {
    public List<Results> results;
    class Results{
        String description_eng,img_url,title_eng;
    }
}

这是界面

public interface GetApi {
    @GET("/api.json")
    public void getData(Callback<List<Feed>> response);
}

我遇到了 json_illegal_syntax Exception 异常。

尝试将“Results”类设置为静态,因为您将其设计为内部类。 - Vincent Vieira
好的。你尝试使用类似 http://jsonformatter.curiousconcept.com 的工具解析响应 JSON 了吗?如果是“非法语法”错误,它应该会告诉你。 - Vincent Vieira
我刚刚测试过了,它是有效的。 - Ye Min Htut
也许你应该为这个类提供一个空的构造函数。 - barisemreefe
不行兄弟。已经测试过了。谢谢你们的建议兄弟们。 :) - Ye Min Htut
4个回答

3
这是我通过创建空构造函数来解决这个问题的方法。
Feed.class
public class Feed{
    private List<Result> results;

    public Feed(){}

    public List<Result> getFeed(){
        return this.results;
    }

    public void setFeed(List<Result> results) {
        this.results = results;
    }
}

Result.class

public class Result{
    private String description_eng;
    private String img_url;
    private String title_eng;

    public Result(){}
    //getters and setters
}

GetApi.class

public interface GetApi {
    @GET("/api.json")
    public void getData(Callback<Feed> response);
}

我遇到了类似的问题:http://stackoverflow.com/questions/39310585/cannot-parse-json-response-object/39314214#39314214 - tccpg288

1

Retrofit默认使用Gson将HTTP请求和响应的body转换为JSON格式。如果您想要指定不同于Gson默认行为的行为(例如命名策略、日期格式、自定义类型),则可以在构建RestAdapter时提供一个新的Gson实例,以实现您所需的行为。

Gson无法自动反序列化纯内部类,因为它们的无参构造函数也需要对包含对象的引用,而在反序列化时该引用并不可用。您可以通过使内部类成为静态类或者为其提供自定义InstanceCreator来解决此问题。以下是一个示例:

public class A { 
  public String a; 

  class B { 

    public String b; 

    public B() {
      // No args constructor for B
    }
  } 
}

注意:默认情况下,上述B类不能使用Gson进行序列化。
你应该阅读更多关于GSON库的内容。

1

@Ye Min Htut,实际上更好的方法是使用泛型编写Feed类。

public class FeedList<T>{
   private List<T> feeds;
   public Feed() {

   }
   public List<T> getFeed(){
       return this.feeds;
   }
   public void setFeed(List<T> results) {
       this.feeds = feeds;
   }
}

如果只有一个对象与之类似,那么可以删除列表部分并获取/设置单个对象。
现在您可以调用FeedList<Result>或任何您想要的对象。

GetApi.class

public interface GetApi {
@GET("/api.json")
    public void getData(Callback<FeedList<Result>> response);
} 

0
@Ye Min Htut,我建議你使用 ROBOPOJO生成器製作模型/POJO類。它將為您生成所有模型類,您不需要自己製作,同時還可以在創建模型類時幫助您。它只需要JSON字符串,點擊即可完成您的工作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接