改造错误:预计BEGIN_ARRAY但是STRING

时间:2015-06-16 13:38:19

标签: android web-services retrofit

在api响应中有时它可以是数组,有时它可以是字符串。

此处详情为数组

 {  "ts": "2015-06-16 11:28:33","success": true,"error": false,"details": [
{
  "user_id": "563",
  "firstname": "K.Mathan"
},
{
  "user_id": "566",
  "firstname": "Surya"
},
{
  "user_id": "562",
  "firstname": "Idaya"
} ]}

有时细节可以是字符串

{  "ts": "2015-06-16 11:28:33",
"success": true,
"error": false,
"details": "no data" }

此处详情为字符串

如何从此类回复中获取价值

我目前的声明是

  @SerializedName(value="details")
   public List<detailslist> details ;

有人请帮我找到解决方案吗?

2 个答案:

答案 0 :(得分:4)

您是否尝试使用原始响应类型?

hh

然后你可以使用JSONObject和JSONArray解析Response,如下所示:

@GET("your_url")
void getDetails(Callback<Response> cb);

getStringFromRetrofitRespone可以是:

    Callback<Response> callback = new Callback<Response>() {
       @Override
       public void success(Response detailsResponse, Response response2) {

        String detailsString = getStringFromRetrofitResponse(detailsResponse);

        try {
            JSONObject object = new JSONObject(detailsString);

            //In here you can check if the "details" key returns a JSONArray or a String

        } catch (JSONException e) {

        }

     }

     @Override
     public void failure(RetrofitError error) {

  });

答案 1 :(得分:0)

我想你可以编写自己的反序列化程序以用于改造,但它也适用于只是推断它是一个对象,然后在你的代码中处理它。

@SerializedName(value="details")
public Object details;