解決:Gson解析java實體類字段中包含json或其他值報錯

1、String轉成List<T>方法:
public static <T> List<T> parseJsonToList(String jsonData, Class<T> myClass) {
    Gson gson = new Gson();
    Type type = new ParameterizedTypeImpl(myClass);
    List<T> array = gson.fromJson(jsonData, type);
    return array;
}

2、調用:

List<User> mrUserList = JsonUtils.parseJsonToList(map.get("UserList") + "", User.class);

3、User類

public class User {
    private Integer id; 
    private String extStr;
    public String getExtStr() {        
        return extStr;
    }

    public void setExtStr(String extStr) {
        this.extStr = extStr;
    }

}

4、當extStr爲json值,比如:{"vip_id":"0","user_nick":"123"}

會報:

-com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected a string but was BEGIN_ARRAY at line 1 column 1637 path $[0].extStr
	at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:226)
at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.read(TypeAdapterRuntimeTypeWrapper.java:41)
	at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:82)
	at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:61)
	at com.google.gson.Gson.fromJson(Gson.java:927)
	at com.google.gson.Gson.fromJson(Gson.java:892)
	at com.google.gson.Gson.fromJson(Gson.java:841)

我剛開始將extStr改爲Object,

public class User {
    private Integer id; 
    private String extStr;
    public Object getExtStr() {        
        return extStr;
    }

    public void setExtStr(Object extStr) {
        this.extStr = extStr;
    }

}

當插入到數據庫的時候,

<insert id="uploadMrTroop" parameterType="java.util.HashMap" >
     insert into user(id, extStr)
     values
        <foreach collection="mrUserList" item="item" separator=",">
             (#{item.id,jdbcType=INTEGER},#{item.extStr,jdbcType=LONGVARCHAR})
        </foreach>
</insert>

會報

Caused by: java.sql.SQLException: Incorrect string value: '\xAC\xED\x00\x05sr...' for column 'extStr' at row 1
	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:957)

5、最終解決方法:

方法一:

extStr改爲Object,在插入數據庫之前,先遍歷一遍List,將extStr重新放入

Iterator<User> mrUserListIterator = mrUserList.iterator();
        while (mrUserListIterator.hasNext()) {
            User userNew = mrUserListIterator.next();
            userNew.setExtStr(userNew.getExtStr+"");        
        }

方法二:

mybatis中insert的時候,實際是獲取的實體類中的get方法

通過debug,發現extStr的類型爲LinkedTreeMap,修改get方法

public Object getExtStr() {
        if(extStr instanceof LinkedTreeMap){

            LinkedTreeMap tm = (LinkedTreeMap) extStr;
            JSONObject jsonObject = new JSONObject();
            Iterator it = tm.keySet().iterator();
            while (it.hasNext()) {
                String key = (String) it.next();
                String value = (String) tm.get(key);
                jsonObject.put(key,value);
            }
            return jsonObject.toString();
        }else{
           return extStr;
        }
    }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章