改造2,解析json,忽略数组

时间:2016-05-27 04:28:17

标签: android json gson retrofit retrofit2

我正在尝试从服务器解析响应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。

5 个答案:

答案 0 :(得分:1)

将来电更改为JSON Object 删除服务器中的false

Retrofit没有解决方案,我认为......

Bcoz boolean进入POJO对象数组。

Boolean只是分配给数据数组

json

这是正确的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)

您的Json无效,请从

中删除,
"parent_pid": "0" 

尝试使用Json formatter & ValidatorJsonLint和其他网站来检查JsonObject是否正确。

答案 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();
        }