簡體   English   中英

如何使用Retrofit 2和Android Studio獲取JSON對象?

[英]How get JSON Object with Retrofit 2 and Android Studio?

我正在Android Studio中創建一個應用程序,我想使用API​​來烹飪食譜,我從使用Android Studio和Java的API中得到以下響應:

API響應

  "q" : "pollo",
  "from" : 0,
  "to" : 10,
  "params" : {
    "sane" : [ ],
    "q" : [ "pollo" ],
    "app_id" : [ "02" ],
    "app_key" : [ "\n66b" ]
  },
  "more" : true,
  "count" : 1000,
  "hits" : [ {
    "recipe" : {
      "uri" : "http://www.edamam.com/ontologies/edamam.owl#recipe_d56f75c72ab67a45174441af1efe4473",
      "label" : "Pollo con Crema a las Hierbas",
      "image" : "http://cdn.kiwilimon.com/recetaimagen/23127/thumb120x90-15802.jpg",
      "source" : "KiwiLimon",
      "url" : "http://www.kiwilimon.com/receta/carnes-y-aves/pollo-con-crema-a-las-hierbas",
      "shareAs" : "http://www.edamam.com/recipe/pollo-con-crema-a-las-hierbas-d56f75c72ab67a45174441af1efe4473/pollo",
      "yield" : 42.0,

繼續使用更多'配方',我想要的只是獲得所有配方必須能夠在我的應用程序中顯示的點擊數組,問題是我收到以下錯誤:

Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1 column 2 path $

我明白這是因為它需要一個數組並獲得一個JSON對象,但我不知道如何解析它,我有我的Recipe模型類和RecipeService服務,我管理MainActivity中的所有內容,我在一些答案中看到過我必須做一個中間響應,但我不明白我如何在我的代碼中實現它,然后我展示了處理所有這些的類。

食譜類(型號):

public class Recipe {
    private String label;
    private String image;
    private String source;
    private String shareAs;
    private List<String> dietLabels;
    private List<String> healthLabels;
    private List<String> cautions;
    private List<String> ingredientLines;
    private List<String> ingredients;
    private double calories;
    private double totalWeight;
    private List<String> totalNutrients;
    private List<String> totalDaily;

    public String getLabel() {
        return label;
    }
    .
    .
    .

RecipeService類:

    public interface RecipeService {

    String API_ROUTE = "/search";
    String API_KEY = "&app_key=" + Credentials.API_KEY;
    String APP_ID = "&app_id=" + Credentials.APP_ID;
    //String query = "";

    @GET(API_ROUTE)
    Call< List<Recipe> > getRecipe(@Query("q") String q);

}

主要活動:

 private void getRecipes() {
        Retrofit retrofit = new Retrofit.Builder()
                            .baseUrl("https://test-es.edamam.com")
                            .addConverterFactory(GsonConverterFactory.create())
                            .build();

        RecipeService recipeService = retrofit.create(RecipeService.class);
        Call<List<Recipe>> call = recipeService.getRecipe("pollo");

        System.out.println("GET RECIPES");
        System.out.println("HEADERS: "+ call.request().headers());

        call.enqueue(new Callback<List<Recipe>>() {
            @Override
            public void onResponse(Call<List<Recipe>> call, Response<List<Recipe>> response) {

                System.out.println("RESPONSE CODE: " + response.code());
                for(Recipe recipe : response.body()){

                    System.out.println("AÑADIENDO: " + recipe.getLabel());
                    recipes.add(recipe.getLabel());
                }
                //System.out.println(recipes.toArray().toString());
            }

            @Override
            public void onFailure(Call<List<Recipe>> call, Throwable t) {
                System.out.println("HA OCURRIDO UN FALLO");
                System.out.println(t.getMessage());
            }
        });
    }

如果API響應正是您發布的內容,則響應為INVALID JSON格式。 您可以通過jsonlint檢查您的JSON有效性。

其次,你的錯誤說,

Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1 column 2 path $

這意味着,POJO是為JSON數組設計的,但是從API中獲取JSON對象。

解決方案非常簡單。

有Android Studio中噸的插件像這樣 ,還是去這個在線轉換工具 希望你不會得到同樣的錯誤,

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM