我正在尝试从服务器解析响应json。数据是一个对象数组,但有时服务器会在数组项之间发送一个布尔值。像这样:
{
"msg_code": 200,
"msg_type": "success",
"msg_text": "success",
"msg_data": [
{
"pid": "1234567",
"time": "1459029423",
"parent_pid": "0"
},
false,
{
"pid": "987654",
"time": "1458997403",
"parent_pid": "0"
}
]
}
正如您所看到的,它们之间存在 false 。
当我尝试解析这些时,转换器到达了错误的数据类型并抛出了这样的异常:
com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was BOOLEAN at line 1 column 9988 path $.msg_data[12]
那么如何跳过这个错误的数据类型并继续解析其他元素呢?
这是我创建Retrofit客户端的代码:
HttpLoggingInterceptor logging = new HttpLoggingInterceptor();
logging.setLevel(logLevel);
OkHttpClient okHttpClient = new OkHttpClient.Builder()
.addInterceptor(logging)
.connectTimeout(60, TimeUnit.SECONDS)
.writeTimeout(60, TimeUnit.SECONDS)
.readTimeout(60, TimeUnit.SECONDS)
.build();
gooderApi = new Retrofit.Builder()
.baseUrl(BASE_API_URL)
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.addConverterFactory(GsonConverterFactory.create())
.client(okHttpClient)
.build()
.create(ApiInterface.class);
我搜索了很多,我知道我必须创建一个自定义转换器工厂,但所有的例子都是旧的,属于Retrofit< 2,我不知道如何让它们为我工作。
更新 类似的问题: GSON ignore elements with wrong type
提前tnx。答案 0 :(得分:1)
将来电更改为JSON Object
或删除服务器中的false
。
Retrofit没有解决方案,我认为......
Bcoz boolean
进入POJO对象数组。
Boolean
只是分配给数据数组。
这是正确的json看起来
{
"msg_code": 200,
"msg_type": "success",
"msg_text": "success",
"msg_data": [
{
"pid": "1234567",
"time": "1459029423",
"parent_pid": "0"
},
false,
{
"pid": "987654",
"time": "1458997403",
"parent_pid": "0"
}
]
}
,
之后"parent_pid": "0"
你必须删除它。
享受编码.........
答案 1 :(得分:0)
答案 2 :(得分:0)
建议:将您的JSON数据放入Json Parser Online以检查您的JSON数据。
答案 3 :(得分:0)
删除,像这样检查json:
{
"msg_code": 200,
"msg_type": "success",
"msg_text": "success",
"msg_data": [
{
"pid": "1234567",
"time": "1459029423",
"parent_pid": "0"
},
false,
{
"pid": "987654",
"time": "1458997403",
"parent_pid": "0"
}
]
}
将您的json转换为Pojo后,您的Pojo类看起来像这样:
package com.example;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.Generated;
import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;
@Generated("org.jsonschema2pojo")
public class Example {
@SerializedName("msg_code")
@Expose
private Integer msgCode;
@SerializedName("msg_type")
@Expose
private String msgType;
@SerializedName("msg_text")
@Expose
private String msgText;
@SerializedName("msg_data")
@Expose
private List<MsgDatum> msgData = new ArrayList<MsgDatum>();
/**
*
* @return
* The msgCode
*/
public Integer getMsgCode() {
return msgCode;
}
/**
*
* @param msgCode
* The msg_code
*/
public void setMsgCode(Integer msgCode) {
this.msgCode = msgCode;
}
/**
*
* @return
* The msgType
*/
public String getMsgType() {
return msgType;
}
/**
*
* @param msgType
* The msg_type
*/
public void setMsgType(String msgType) {
this.msgType = msgType;
}
/**
*
* @return
* The msgText
*/
public String getMsgText() {
return msgText;
}
/**
*
* @param msgText
* The msg_text
*/
public void setMsgText(String msgText) {
this.msgText = msgText;
}
/**
*
* @return
* The msgData
*/
public List<MsgDatum> getMsgData() {
return msgData;
}
/**
*
* @param msgData
* The msg_data
*/
public void setMsgData(List<MsgDatum> msgData) {
this.msgData = msgData;
}
}
答案 4 :(得分:0)
试试这个:
try {
JSONObject jsonObject = new JSONObject(yourJson);
JSONArray jsonArray = jsonObject.getJSONArray("msg_data");
for(int i=0;i<jsonArray.length();i++) {
if (jsonArray.get(i) instanceof JSONObject) {
JSONObject jsonObject1 = jsonArray.getJSONObject(i);
} else {
Boolean b = jsonArray.getBoolean(i);
}
}
}catch (Exception e) {
e.printStackTrace();
}