最近用到了json字符串转实体类,转集合的功能,
主要代码如下:
/** * json 字符串转集合 * * @author lipw * @date 2017年5月10日下午6:08:17 * @param jsonString * @param pojoCalss * 集合中的类 * @return */ public staticListjsonToList(String jsonString, ClasspojoCalss) { if (jsonString.indexOf("%5B") != -1){ try { jsonString = URLDecoder.decode(jsonString, "utf-8"); } catch (UnsupportedEncodingException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if (StringUtil.isBlank(jsonString)) { return null; } try { String[] dateFormats = new String[] {"yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss"}; JSONUtils.getMorpherRegistry().registerMorpher(new DateMorpherEx(dateFormats, null, null, false)); //JSONUtils.getMorpherRegistry().registerMorpher(morpher); JSONArray jsonArray = JSONArray.fromObject(jsonString); // Java集合 @SuppressWarnings("unchecked") Listlist = (List) JSONArray.toCollection(jsonArray, pojoCalss); return list; } catch (Exception ex) { ex.printStackTrace(); return null; } }
注意,这已经是修改完的代码。
问题描述1、当不添加以下代码的时候,总是把日期转换为当前时间:
String[] dateFormats = new String[] {"yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss"}; JSONUtils.getMorpherRegistry().registerMorpher(new DateMorpherEx(dateFormats, null, null, false));
这里的 DateMorpherEx 是自己重写的扩展类,如果你仅仅是解决此问题,可以改为:DateMorpher,但是不能像我这样使用4个参数的构造函数,因为 DateMorpher 的 defaultValue 是不能为 null 的。
2、添加以上代码后,如果json字符串中的日期与dateFormats中的第一个不一致,就有可能产生一个问题:转换出来的日期少了一年,月分也对不上。比如json字符串中的日期格式是:2019-04-04,而dateFormats中的第一个是yyyyMMdd,那就会出问题。
3、不允许传空字符串值,否则出异常:Error while setting property=beginDate type class java.lang.String
这需要通过重写 DateMorpher 类来实现。
参考:net.sf.json.JSONObject 转实体类时遇到 空“”被赋值一个当前时间的问题