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原因,估计就很困难了。

 

 

 
 

转载于:https://www.cnblogs.com/xk920/p/9933911.html

你可能感兴趣的:(jackson使用问题:mapper.readValue()将JSON字符串转反序列化为对象失败或异常)