解决: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;
        }
    }

 

参与评论 您还未登录,请先 登录 后发表或查看评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:数字20 设计师:CSDN官方博客 返回首页

打赏作者

tuantuanyuyu

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值