改造错误:预期为 BEGIN_ARRAY,但实际为 STRING

Mat*_*r K 6 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"
} ]}
Run Code Online (Sandbox Code Playgroud)

有时细节可以是字符串

{  "ts": "2015-06-16 11:28:33",
"success": true,
"error": false,
"details": "no data" }
Run Code Online (Sandbox Code Playgroud)

这里的详细信息是字符串

如何从此类响应中获取价值

我目前的声明是

  @SerializedName(value="details")
   public List<detailslist> details ;
Run Code Online (Sandbox Code Playgroud)

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

nic*_*sso 6

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

@GET("your_url")
void getDetails(Callback<Response> cb);
Run Code Online (Sandbox Code Playgroud)

然后您可以使用 JSONObject 和 JSONArray 解析响应,如下所示:

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

  });
Run Code Online (Sandbox Code Playgroud)

getStringFromRetrofitRespone 可能是:

public static String getStringFromRetrofitResponse(Response response) {
    //Try to get response body
    BufferedReader reader = null;
    StringBuilder sb = new StringBuilder();
    try {

        reader = new BufferedReader(new InputStreamReader(response.getBody().in()));

        String line;

        try {
            while ((line = reader.readLine()) != null) {
                sb.append(line);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    } catch (IOException e) {
        e.printStackTrace();
    }

    return sb.toString();

}
Run Code Online (Sandbox Code Playgroud)