JSON解析与改造

时间:2014-12-26 10:44:03

标签: android json retrofit

我最近开始使用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 Class

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

4 个答案:

答案 0 :(得分: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);
}

答案 1 :(得分:1)

Retrofit默认使用Gson将HTTP主体转换为JSON和从JSON转换。如果要指定与Gson默认值不同的行为(例如命名策略,日期格式,自定义类型),请在构建RestAdapter时提供具有所需行为的新Gson实例。

Gson不能自动反序列化纯内部类,因为它们的no-args构造函数还需要对反序列化时不可用的包含Object的引用。您可以通过使内部类静态或为其提供自定义InstanceCreator来解决此问题。这是一个例子:

public class A { 
  public String a; 

  class B { 

    public String b; 

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

注意:上面的B类不能(默认情况下)用Gson序列化。

您应该阅读有关GSON library

的更多信息

答案 2 :(得分: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;
   }
}

如果只有一个对象有类似的东西,那么你可以删除List部分并获取/设置单个对象。

现在您可以调用FeedList<Result>或任何您想要的对象。

GetApi.class

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

答案 3 :(得分:0)

@Ye Min Htut我建议您使用ROBOPOJO生成器来创建Model / POJO类。它将为您生成所有模型类,您不需要自己创建,也将为您提供帮助创建模型类的未来。它只需要JSON字符串,然后单击即可完成您的工作