zoukankan      html  css  js  c++  java
  • jackson使用问题:mapper.readValue()将JSON字符串转反序列化为对象失败或异常

    问题根源:转化目标实体类的属性要与被转JSON字符串总的字段 一 一对应!字符串里可以少字段,但绝对不能多字段。

     

    先附上我这段出现了问题的源码:

        // 1.接收并转化相应的参数。需要在pom.xml中引入jackson-databind这个包
            String shopStr = HttpServletRequestUtil.getString(request, "shopStr");
            ObjectMapper mapper = new ObjectMapper();
            Shop shop = null;
            try {
                // 将前端接收来的一些String的信息,转换为Shop实体类
                shop = mapper.readValue(shopStr, Shop.class);
            } catch (Exception e) {
                modelMap.put("success", false);
                modelMap.put("errMsg", e.getMessage());
                return modelMap;
            }

    开始这里跑得时候也不报错,但就是跑不通,就用debug断点一句一句查看,发现问题就出在了

     shop = mapper.readValue(shopStr, Shop.class);这一句上。
    网上搜索了若干方法都没有发现问题所在,然后阅读文档才发现有这样一个参数设置:
    //设置输入时忽略JSON字符串中存在而Java对象实际没有的属性  
    mapper.getDeserializationConfig().set(                  
        org.codehaus.jackson.map.DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);

    然后我就想,是不是我前端发送数据的时候塞错数据了?(PS:不要着急乱添加上面这个设置,原因下面会说)

    于是又用断点测了下值(如下图):

    然后去跟目标实体类对了下字段。

    发现这里shopStr里并没有多出没有字段,那没道理跑不通啊,于是再仔细一看!  发现是没有多字段,但是 = = 

    实体类里这个属性为shopCategory 而我测试出来shopStr里的这个字段我拼成了shopCatrgory。

    然后去js里看了下代码,果不其然。一个字母写错了。

    我是真真的把自己服哈了,归根结底,居然是这种低级错误导致的。

    前面说到的不要乱添加上面的设置原因就是,如果你也跟我一样是因为打错字母导致多了一个字段的,那么你就算添加了上面的那个设置,你在后面用值时,也会发现取不到你想要用的值,

    而且你添加了上面设置,是不报错了,但是会导致问题更不好找,就好比我添加了以后,在取转化后shop对象里的shopCategory时,会是NULL。那你再想找到NULL原因,估计就很困难了。

     
     
  • 相关阅读:
    课堂测试-文本操作
    异常的总结
    动手动脑实验-异常
    从小工到专家-读后感3
    从小工到专家-读后感2
    从小工到专家-读后感1
    构建之法读书笔记(一)
    2.12日总结
    BaseAdapter的使用
    Activity之Bundle的使用
  • 原文地址:https://www.cnblogs.com/xk920/p/9933911.html
Copyright © 2011-2022 走看看