Как получить JSON Object с Retrofit 2 и Android Studio? - PullRequest
0 голосов
/ 23 июня 2019

Я делаю приложение в Android Studio и хочу использовать API для приготовления рецептов, у меня есть следующий ответ от API, который я использую с Android Studio и Java:

Ответ 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;
    }
    .
    .
    .

Класс обслуживания рецептов:

    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);

}

MainActivity:

 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());
            }
        });
    }

1 Ответ

0 голосов
/ 23 июня 2019

Если ответ API - это именно то, что вы публикуете, тогда ответ НЕВЕРНЫЙ формат JSON. Вы можете проверить действительность JSON по jsonlint .

Во-вторых, ваша ошибка говорит,

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

Это означает, что POJO разработан для массива JSON, но из API вы получаете объект JSON.

Решение действительно простое.

В Android Studio существует множество плагинов, таких как this или go этого онлайн-конвертера . Тогда, надеюсь, вы не получите ту же ошибку,

...