Android-无法使用Retrofit2提取JSON

时间:2018-07-20 06:15:33

标签: java android retrofit2

我正在尝试使用URL获取JSON文件,但是应用程序崩溃了。

JSON file api

MainActivity.java

Retrofit retrofit = new Retrofit.Builder()
            .baseUrl(ApiService.BASE_URL)
            .addConverterFactory(GsonConverterFactory.create())
            .build();

ApiService service = retrofit.create(ApiService.class);

// Logs show error is in the code below
service.getPopulationData(new Callback<Flag> (){
        @Override
        public void onResponse(Call<Flag> call, Response<Flag> response) {
            Log.d("JSONData", response.body().toString());
        }

        @Override
        public void onFailure(Call<Flag> call, Throwable t) {
            Log.d("JSONData", t.getMessage());
        }
    });

ApiService.java

public interface ApiService {
    String BASE_URL = "http://www.androidbegin.com/";

    @GET("tutorial/jsonparsetutorial.txt")
    public void getPopulationData(Callback<Flag> callback) ;
}

Flag.java

public class Flag {
    private int rank;
    private String country;
    private String population;
    private String flag;

    public int getRank() {
        return rank;
    }

    public void setRank(int rank) {
        this.rank = rank;
    }

    public String getCountry() {
        return country;
    }

    public void setCountry(String country) {
        this.country = country;
    }

    public String getPopulation() {
        return population;
    }

    public void setPopulation(String population) {
        this.population = population;
    }

    public String getFlag() {
        return flag;
    }

    public void setFlag(String flag) {
        this.flag = flag;
    }
}

编辑:错误日志可以在这里找到:log

我已经尝试了在stackoverflow上提到的其他解决方案,但是我一直无法正确解决问题。

此外,我只希望JSON文件中的标志URL。我应该如何得到它?

2 个答案:

答案 0 :(得分:1)

您将需要以下两个pojo课程

JsonResponse.java

scanf

Worldpopulation.java

    public class JsonResponse {

@SerializedName("worldpopulation")
@Expose
private List<Worldpopulation> worldpopulation = null;

public List<Worldpopulation> getWorldpopulation() {
return worldpopulation;
}

public void setWorldpopulation(List<Worldpopulation> worldpopulation) {
this.worldpopulation = worldpopulation;
}

}

并进行如下所示的改装呼叫

    public class Worldpopulation {

@SerializedName("rank")
@Expose
private Integer rank;
@SerializedName("country")
@Expose
private String country;
@SerializedName("population")
@Expose
private String population;
@SerializedName("flag")
@Expose
private String flag;

public Integer getRank() {
return rank;
}

public void setRank(Integer rank) {
this.rank = rank;
}

public String getCountry() {
return country;
}

public void setCountry(String country) {
this.country = country;
}

public String getPopulation() {
return population;
}

public void setPopulation(String population) {
this.population = population;
}

public String getFlag() {
return flag;
}

public void setFlag(String flag) {
this.flag = flag;
}

}

**** service.getPopulationData(new Callback<JsonResponse> (){ @Override public void onResponse(Call<JsonResponse> call, Response<JsonResponse> response) { Log.d("JSONData", response.body().toString()); ArrayList<Worldpopulation> population=new ArrayList(response.body().getWorldpopulation()); } @Override public void onFailure(Call<JsonResponse> call, Throwable t) { Log.d("JSONData", t.getMessage()); } }); ****

并更改 ApiService.java

edited as per requirement

并这样称呼它 在此处进行编辑

public interface ApiService {
String BASE_URL = "http://www.androidbegin.com/";

@GET("tutorial/jsonparsetutorial.txt")
Call<JsonResponse> getPopulationData() ;
}

答案 1 :(得分:0)

您要使用Retrofit解析的json包含一个JSON数组作为其根worldpopulation,因此首先您需要一个WorldPopulation类,如下所示:

public class WorldPopulation
{
private List<Flag> worldpopulation;

    public List<Flag> getWorldpopulation() {
        return worldpopulation;
    }

    public void setWorldpopulation(List<Flag> worldpopulation) {
        this.worldpopulation = worldpopulation;
    }
}


public interface ApiService {
    String BASE_URL = "http://www.androidbegin.com/";

    @GET("tutorial/jsonparsetutorial.txt")
    public void getPopulationData(Callback<WorldPopulation> callback) ;
}