Разбор объекта Gson - PullRequest
       15

Разбор объекта Gson

0 голосов
/ 22 января 2019

Может ли кто-нибудь помочь мне получить этот объект, используя модификацию в Android.Я хочу, чтобы эти объекты были списком массивов.

{"UtilDataType":[{"name":"Pondicherry","id":22},{"name":"Vizianagaram","id":23},{"name":"Srikakulam","id":24}]}

Мой интерфейс API

public interface MyAPI {
  @GET("city")
  Call<ResponseBody> getCities(@Query("first") long since, @Query("max") int perPage);
}

Класс моей модели

public class City {
   private int id;

   public int getId() {
     return id;
   }

  public void setId(int id) {
     this.id = id;
  }

  public String getName() {
     return name;
  }

  public void setName(String name) {
     this.name = name;
  }

  private String name;
  public static DiffUtil.ItemCallback<City> DIFF_CALLBACK = new DiffUtil.ItemCallback<City>() {
    @Override
    public boolean areItemsTheSame(@NonNull City oldItem, @NonNull City newItem) {
        return oldItem.id == newItem.id;
    }

    @Override
    public boolean areContentsTheSame(@NonNull City oldItem, @NonNull City newItem) {
        return oldItem.equals(newItem);
    }
  };
}

Я пробовал много способов и все еще пытаюсь.Ниже приведен метод.

service.getCities(first,max).enqueue(new Callback<ResponseBody>() {
        @Override
        public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
            Log.i("blb07",""+response.body().toString());

            try {
                UtilClass utilClass=new Gson().fromJson(response.body().toString(),UtilClass.class);
                //Log.i("blb07",""+utilClass.getUtilDataType());
            }catch (Exception e){
                Log.i("blb07","hello "+e.getMessage());
            }
            //JSONArray userArray = response.getJSONArray("UtilDataType");
            //ArrayList<City> temp=new Gson().fromJson(response.body().toString(), new TypeToken<List<City>>() {}.getType());
            //Log.i("blb07",""+temp.size());
        }

        @Override
        public void onFailure(Call<ResponseBody> call, Throwable t) {
            Log.i("blb07",""+t.getMessage());
        }
    });

Моя цель состоит в том, чтобы получить эти городские объекты в списке для пейджинговой концепции в Android.Теперь я застрял в этой вещи.Кто-нибудь, помогите мне, пожалуйста.

Ответы [ 3 ]

0 голосов
/ 22 января 2019

синтаксический анализ вручную не позволяет использовать конвертер GSON ;вам нужно аннотировать POJO:

import com.google.gson.annotations.SerializedName;

public class UtilDataType {

    @SerializedName("id")
    private Long id;

    @SerializedName("name")
    private String name;

    @NonNull
    public Long getId() {
        return this.id;
    }

    @NonNull
    public String getName() {
        return this.name;
    }   

    public void setId(Long value) {
        this.id = value;
    }

    public void setName(String value) {
        this.name = value;
    }
}

, тогда UtilDataType может быть ожидаемым типом данных.Например:

@GET("city")
Call<UtilDataType> getCities(
    @Query("first") long since,
    @Query("max") int perPage
);

см. мой клиент GitHub , который использует это много ...


также, когда response.body() делаетне иметь значения, попробуйте response.errorBody().string().

, и когда это потребуется для сравнения, просто позвольте классу UtilDataType реализовать Compareable.

0 голосов
/ 25 января 2019

Отвечая на мой собственный вопрос.Спасибо Мартин Цайтлер, ваши примеры полезны.

Я изменил Мой UtilClass на

public class UtilClass {
   private ArrayList<City> UtilDataType;

   public ArrayList<City> getUtilDataType() {
     return UtilDataType;
   }

   public void setUtilDataType(ArrayList<City> utilDataType) {
     UtilDataType = utilDataType;
   }
}

И мой интерфейс

public interface MyAPI {
   @GET("city")
   Call<UtilClass> getCities(@Query("first") long since, @Query("max") int perPage);
}

И, наконец, мой основной класс

service.getCities(first,max).enqueue(new Callback<UtilClass>() {
        @Override
        public void onResponse(Call<UtilClass> call, Response<UtilClass> response) {
            if (response.isSuccessful() && response.code() == 200) {

                try {
                    String jsonString=new Gson().toJson(response.body());
                    UtilClass object=new Gson().fromJson(jsonString,UtilClass.class);

                    cities.addAll(object.getUtilDataType());
                    callback.onResult(cities);

                }catch (Exception e){
                    Log.i("blb07","hello "+e.getMessage());
                }
            } else {
                Log.i("blb07", response.message());
            }
        }

        @Override
        public void onFailure(Call<UtilClass> call, Throwable t) {
            String errorMessage;
            errorMessage = t.getMessage();
            if (t == null) {
                errorMessage = "unknown error";
            }
            Log.i("blb07",errorMessage);
        }
    });
0 голосов
/ 22 января 2019

Используйте response.string() вместо response.body().toString(). Для справки вы можете посмотреть этот класс FlickrApiService

...