【问题标题】:Retrofit: Problems handling array or single object改造:处理数组或单个对象的问题
【发布时间】:2015-08-10 20:50:38
【问题描述】:

我一直在关注其他答案,但是我找不到一个缺少的步骤,这导致调用成功但数据没有被正确解析,因为我进行的第一次调用返回了一个对象列表,但只返回了一个对象都是空的

MyModel.java

    public class MyModel {
        @SerializedName("url")
        private String mUrl;

        @SerializedName("name")
        private String mName;

        @SerializedName("description")
        private String mDescription;
    }

MyModelDeserializer.java

这只是检查它的数组或对象,并将简单地返回数组

public class MyModelTypeAdapter implements JsonDeserializer<ArrayList<MyModel>>{

    @Override
    public ArrayList<MyModel> deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
            ArrayList<MyModel> objects = new ArrayList<>();
            if(json.isJsonArray()){
                for(JsonElement e : json.getAsJsonArray()){
                    objects.add((MyModel)context.deserialize(e,MyModel.class));
                }
            }else if(json.isJsonObject()){
                objects.add((MyModel)context.deserialize(json,MyModel.class));
            }
        return objects;
    }
}

其他一些东西

 Gson gson = new GsonBuilder()
                    .registerTypeAdapter(new TypeToken<ArrayList<MyModel>>() {}.getType(), new MyModelTypeAdapter())
                    .create();
 restAdapter = new RestAdapter.Builder()
                    .setEndpoint(BuildConstants.BASE_URL)
                    .setConverter(new GsonConverter(gson))
                    .setClient(new OkClient(okHttpClient))
                    .setLogLevel(RestAdapter.LogLevel.FULL)
                    .build();

这是让我困惑的部分,我将什么作为回调的返回类型

@GET(URLConstants.LIST_URL)
    void getData(Callback<ArrayList<MyModel>> callback);

编辑 JSON 数据

{
  "places": [
    {
      "url": "www.google.com",
      "name": "Google",
      "description": "Search engine"
    },
    {
      "url": "www.Facebook.com",
      "name": "Facebook",
      "description": "Social Network"
    },

    {
      "url": "www.amazon.com",
      "name": "Amazon",
      "description": "Shopping"
    }
]
  }

【问题讨论】:

  • 你能发布你的json响应吗?
  • @Sree14 我已经发布了 json 数据。它可以是这样的数组,也可以是单个对象。

标签: java android retrofit


【解决方案1】:

首先创建一个POJO类来处理json。您可以使用jsonschema2pojo 为您的 json 创建 pojo 类:

public class MyModel {

    @Expose
    private List<Place> places = new ArrayList<Place>();

    /**
     *
     * @return
     * The places
     */
    public List<Place> getPlaces() {
        return places;
    }

    /**
     *
     * @param places
     * The places
     */
    public void setPlaces(List<Place> places) {
        this.places = places;
    }

}

public class Place {

    @Expose
    private String url;
    @Expose
    private String name;
    @Expose
    private String description;

    /**
     *
     * @return
     * The url
     */
    public String getUrl() {
        return url;
    }

    /**
     *
     * @param url
     * The url
     */
    public void setUrl(String url) {
        this.url = url;
    }

    /**
     *
     * @return
     * The name
     */
    public String getName() {
        return name;
    }

    /**
     *
     * @param name
     * The name
     */
    public void setName(String name) {
        this.name = name;
    }

    /**
     *
     * @return
     * The description
     */
    public String getDescription() {
        return description;
    }

    /**
     *
     * @param description
     * The description
     */
    public void setDescription(String description) {
        this.description = description;
    }

}

接下来像这样创建一个重新适配器:

public class SimpleRestClient {

private SimpleRestApi simpleRestApi;

public SimpleRestClient() {

    RestAdapter restAdapter = new RestAdapter.Builder()
            .setLogLevel(RestAdapter.LogLevel.FULL)
            .setEndpoint(Constants.BASE_URL)
            .build();

    simpleRestApi = restAdapter.create(SimpleRestApi.class);

}

public SimpleRestApi getSimpleRestApi() {

    return simpleRestApi;

}

}

现在创建 api 接口。这里我们设置我们的 POJO 类来处理 json 响应:

public interface SimpleRestApi {

@GET("Enter URL")
public void getSimpleResponse(Callback<MyModel> handlerCallback);

}

最后调用如下:

simpleRestApi = new SimpleRestClient().getSimpleRestApi();
    simpleRestApi.getSimpleResponse(new Callback<MyModel>() {
        @Override
        public void success(MyModel responseHandler, Response response) {
            // here you can get your url, name and description.
        }

        @Override
        public void failure(RetrofitError error) {
            progress.dismiss();
            Log.e("CLASS", "JSON: " + error.getCause());
        }
    });

参考文献:

jsonschema2pojo

A smart way to use retrofit

【讨论】:

  • 如果我的 json 数据始终是一个列表,但它可以返回没有数组的单个对象,这没关系
  • 如果可以的话,我宁愿尝试更改 API,这不是正确的行为
猜你喜欢
  • 2019-06-03
  • 2016-11-02
  • 1970-01-01
  • 2017-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-20
  • 2015-02-16
相关资源
最近更新 更多