个人博客导航页(点击右侧链接即可打开个人博客):大牛带你入门技术栈
通常来说,序列化json,实际上有2总方式
- 通过当前流行的JSON工具。
- 编写代码,手工序列化
这俩种方式各有优劣。第一种方式毫无疑问,不需要开发者做什么工作,直接调用序列化接口,输出就是json。但是,如果需要特殊需求,比如需要将日期格式化按照yyyy-mm-dd 输出,这些JSON工具可以指定日期格式化输出,比如FastJSON里:
SerializeConfig mapping = new SerializeConfig(); String dateFormat = "yyyy-MM-dd"; mapping.put(Date.class, new SimpleDateFormatSerializer(dateFormat)); String json = JSON.toJSONString(obj,mapping);
在Jackon里,代码也是类似,如:
ObjectMapper objectMapper = new ObjectMapper(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); objectMapper.setDateFormat(sdf); objectMapper.writeValue(writer, obj);
对于这种常见需求,JSON工具总有通过Annotation&&SerializerFeature组合来解决 ,但也有应对不了的,如一下一些问题
- 对象里有个字段是Calendar,我想格式化yyyy-MM-dd 输出。
- 对象里另外有个字段也是Calendar,我想仅仅输出time(Long类型)
- 对象及其关联对象的id我都不想输出。
- 如果某个对象的集合属性为null,则仅仅输出[], 但另外一个集合属性未null,则输出null。
当前流行工具总是疲于应付这种“变态”序列化需求,不停的升级版本增加处理类来解决这些需求。有没有终极解决办法吗?
在回答这个问题前,让我们回归到我说的第二种序列化解决方法,就是手工编写代码。通过硬编码貌似是是终极奥义。各种变态序列化需求都能通过硬编码来解决。然而,这种终极奥义的问题是序列化太麻烦了。面对企业应用,互联网应用中成百上千的模型,手工来序列化是不现实的,那么,有没有第三个办法,既能方便序列化对象,有具有很强的序列化能力,应付各