Retrofit error: Expected BEGIN_ARRAY but was STRING
Retrofit error: Expected BEGIN_ARRAY but was STRING
在api响应中有时可以是数组,有时可以是字符串。
这里的细节是Array
{ "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" }
这里的细节是String
如何从此类响应中获取价值
我目前的声明是
@SerializedName(value="details")
public List<detailslist> details ;
谁能帮我找到解决办法?
我想您可以编写自己的反序列化器以用于改造,但它也可以仅推断它是一个对象,然后稍后在您的代码中处理它。
@SerializedName(value="details")
public Object details;
您尝试使用原始响应类型了吗?
@GET("your_url")
void getDetails(Callback<Response> cb);
然后您可以像这样使用 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) {
});
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();
}
在api响应中有时可以是数组,有时可以是字符串。
这里的细节是Array
{ "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" }
这里的细节是String
如何从此类响应中获取价值
我目前的声明是
@SerializedName(value="details")
public List<detailslist> details ;
谁能帮我找到解决办法?
我想您可以编写自己的反序列化器以用于改造,但它也可以仅推断它是一个对象,然后稍后在您的代码中处理它。
@SerializedName(value="details")
public Object details;
您尝试使用原始响应类型了吗?
@GET("your_url")
void getDetails(Callback<Response> cb);
然后您可以像这样使用 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) {
});
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();
}