架构师_程序员_码农网

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

搜索
查看: 10825|回复: 1

[资料] jackson 常见错误解决方案

[复制链接]
发表于 2019-1-14 16:23:10 | 显示全部楼层 |阅读模式
com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `com.itsvse.es.models.CarPosition` (no Creators, like default construct, exist): cannot deserialize from Object value (no delegate- or property-based Creator)

Cannot construct instance of `com.itsvse.es.models.CarPosition$Point` (although at least one Creator exists): can only instantiate non-static inner class by using default, no-argument constructor
解决方案:

类添加构造函数,如下:

  1. public CarPosition(){}
  2. public Point(){}
复制代码

com.fasterxml.jackson.core.JsonParseException: Unexpected character ('' (code 65279 / 0xfeff)): expected a valid value (number, String, array, object, 'true', 'false' or 'null')


错误原因:

我用Java读取的txt文本文件是uft-8 bom编码格式导致,我将文件文件转换成utf-8会正常!但是由于我文件太多了,总不能每一个都手动转成utf-8格式吧!

引用

EF BB BF 54 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20 6C 69 6E 65 2E

?This is the first line.

54 68 69 73 20 69 73 20 73 65 63 6F 6E 64 20 6C 69 6E 65 2E

This is second line.

红色部分的"EF BB BF"刚好是UTF-8文件的BOM编码,可以看出Java在读文件时没能正确处理UTF-8文件的BOM编码,将前3个字节当作文本内容来处理了。


解决方案:

maven引用如下包:

  1. <!-- 处理utf bom问题 -->
  2.         <dependency>
  3.             <groupId>commons-io</groupId>
  4.             <artifactId>commons-io</artifactId>
  5.             <version>2.6</version>
  6.         </dependency>
复制代码
读txt文件代码如下:

  1. /**
  2.      * 获取txt文件内容并按行放入list中
  3.      */
  4.     public static List<String> getFileContext(String path) throws Exception {
  5.         //FileReader fileReader =new FileReader(path);
  6.         //BufferedReader bufferedReader =new BufferedReader(fileReader);
  7.         BufferedReader bufferedReader =new BufferedReader(new InputStreamReader(new BOMInputStream(new FileInputStream(path))));
  8.         //reader = new BufferedReader(new InputStreamReader(new BOMInputStream(new FileInputStream(file))));
  9.         List<String> list =new ArrayList<String>();
  10.         String str=null;
  11.         while((str=bufferedReader.readLine())!=null) {
  12.             if(str.trim().length()>2) {
  13.                 list.add(str);
  14.             }
  15.         }
  16.         return list;
  17.     }
复制代码
我测试无论是读取utf-8 bom文件,还是utf-8格式的文件,都能成功转成utf-8格式的文件,并且反序列化成功!

最后说一句,再也不用fastjson!碰到阿里系的开源,如果不是优势天差地别,绕道别碰。




上一篇:2018汪文君Google Guava实战视频教程
下一篇:Java读取Unicode文件(UTF-8等)时碰到的BOM首字符问题
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
 楼主| 发表于 2019-1-15 09:34:36 | 显示全部楼层
封装的jackson工具类:

  1. package com.itsvse.es.common;

  2. import com.fasterxml.jackson.core.JsonFactory;
  3. import com.fasterxml.jackson.core.JsonGenerator;
  4. import com.fasterxml.jackson.core.JsonParseException;
  5. import com.fasterxml.jackson.databind.JsonMappingException;
  6. import com.fasterxml.jackson.databind.ObjectMapper;

  7. import java.io.IOException;
  8. import java.io.StringWriter;

  9. public class JacksonUtil {
  10.     private static ObjectMapper mapper = new ObjectMapper();

  11.     public static String bean2Json(Object obj) throws IOException {
  12.         String json= mapper.writeValueAsString(obj);
  13.         return json;
  14.     }

  15.     public static <T> T json2Bean(String jsonStr, Class<T> objClass)
  16.             throws JsonParseException, JsonMappingException, IOException {
  17.         return mapper.readValue(jsonStr, objClass);
  18.     }
  19. }
复制代码
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

免责声明:
码农网所发布的一切软件、编程资料或者文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。

Mail To:help@itsvse.com

QQ|手机版|小黑屋|架构师 ( 鲁ICP备14021824号-2 )|网站地图

GMT+8, 2024-10-8 11:42

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表