从json-lib转成jackson的遇到的问题
从json-lib转成jackson的遇到的问题
问题一:json 字符串,再经过Jackson序列化之后就变成原生字符串了。而json-lib经过再序列化之后,还是json格式的串。
针对这种情况,可以写一个Serializer类,遇到json串的时候就当作原生字符串写入即可。
<<JsonStringSerializer>>
/**
* 序列化时,对Json格式的字符串做特殊处理:不用引号括起来
* @author
*
*/
public class JsonStringSerializer extends JsonSerializer<Object> {
@Override
public void serialize(Object value, JsonGenerator jgen, SerializerProvider provider) throws IOException {
if (value == null) {
jgen.writeNull();
} else {
if (value instanceof String) {
String newValue = ((String) value).trim();
// 只对Json格式的字符串做处理
if (newValue.startsWith("{") || newValue.startsWith("[")) {
jgen.writeRawValue((String) value);
} else {
jgen.writeObject(value);
}
} else {
jgen.writeObject(value);
}
}
}
}
问题二、jackson和json-lib对null值的处理大不相同。对于值为null的字符串类型的字段,jackson输出null,而json-lib输出空字符串。对于List类型,json-lib输出空列表[],而jackson还是输出null。
如果是从json-lib移植到jackson,为了兼容老代码,可以写一个SerializerProvider,遇到null值输出空字符串等。
<<NullToEmptyStringProvider>>
/**
* Customize the DefaultSerializerProvider so that when it is looking for a
* NullSerializer it will use one that is class sensitive, writing strings as ""
* and everything else using the default value.
*
* @author
*/
public class NullToEmptyStringProvider extends DefaultSerializerProvider {
private static final long serialVersionUID = -1L;
// A couple of constructors and factory methods to keep the compiler happy
public NullToEmptyStringProvider() {
super();
}
public NullToEmptyStringProvider(NullToEmptyStringProvider provider, SerializationConfig config,
SerializerFactory jsf) {
super(provider, config, jsf);
}
@Override
public NullToEmptyStringProvider createInstance(SerializationConfig config, SerializerFactory jsf) {
return new NullToEmptyStringProvider(this, config, jsf);
}
@Override
public JsonSerializer<Object> findNullValueSerializer(BeanProperty property) throws JsonMappingException {
if (property.getType().getRawClass().equals(String.class)) {
return EmptyStringSerializer.INSTANCE;
} else if ((property.getType().isArrayType() || property.getType().isCollectionLikeType())
&& !property.getType().isMapLikeType()) {
return EmptyListSerializer.INSTANCE;
} else if (property.getType().getRawClass().equals(Long.class)
|| property.getType().getRawClass().equals(Short.class)
|| property.getType().getRawClass().equals(Integer.class)
|| property.getType().getRawClass().equals(Double.class)
|| property.getType().getRawClass().equals(Float.class)
|| property.getType().getRawClass().equals(BigDecimal.class)) {
return EmptyNumberSerializer.INSTANCE;
} else {
return super.findNullValueSerializer(property);
}
}
}
/**
* Output null of String to empty string.
*
* @author
*
*/
class EmptyStringSerializer extends JsonSerializer<Object> {
public static final JsonSerializer<Object> INSTANCE = new EmptyStringSerializer();
private EmptyStringSerializer() {
}
// Since we know we only get to this seralizer in the case where the value
// is null and the type is String, we can
// do our handling without any additional logic and write that empty string
// we are so desperately wanting.
@Override
public void serialize(Object o, JsonGenerator jsonGenerator, SerializerProvider serializerProvider)
throws IOException {
jsonGenerator.writeString("");
}
}
/**
* For null list
* @author
*
*/
class EmptyListSerializer extends JsonSerializer<Object> {
public static final JsonSerializer<Object> INSTANCE = new EmptyListSerializer();
private EmptyListSerializer() {
}
// Since we know we only get to this seralizer in the case where the value
// is null and the type is String, we can
// do our handling without any additional logic and write that empty string
// we are so desperately wanting.
@Override
public void serialize(Object o, JsonGenerator jsonGenerator, SerializerProvider serializerProvider)
throws IOException {
jsonGenerator.writeStartArray();
jsonGenerator.writeEndArray();
}
}
/**
* For null Number, such as Integer, Long, Short ....
* @author
*
*/
class EmptyNumberSerializer extends JsonSerializer<Object> {
public static final JsonSerializer<Object> INSTANCE = new EmptyNumberSerializer();
private EmptyNumberSerializer() {
}
// Since we know we only get to this seralizer in the case where the value
// is null and the type is String, we can
// do our handling without any additional logic and write that empty string
// we are so desperately wanting.
@Override
public void serialize(Object o, JsonGenerator jsonGenerator, SerializerProvider serializerProvider)
throws IOException {
jsonGenerator.writeNumber(0);
}
}
最后,需要把这个provider配置到jackson的mapper实例中。
jsonMapper.setSerializerProvider(new NullToEmptyStringProvider());
从json-lib转成jackson的遇到的问题的更多相关文章
- 使用jackson来进行数组格式的json字符串转换成List。
有一个字符串如下.如下,也是通过jackson把list转换成的json字符串,我想把它转过来,看网上的内容都不尽人如意,都是片断的内容.估计只有写的知道怎么使用,所以就直接看了jackson的官网, ...
- Atitit.json类库的设计与实现 ati json lib
Atitit.json类库的设计与实现 ati json lib 1. 目前jsonlib库可能有问题,可能版本冲突,抛出ex1 2. 解决之道:1 2.1. 自定义json解析库,使用多个复合的js ...
- Java json工具类,jackson工具类,ObjectMapper工具类
Java json工具类,jackson工具类,ObjectMapper工具类 >>>>>>>>>>>>>>> ...
- 使用JsonConfig控制JSON lib序列化
将对象转换成字符串,是非常常用的功能,尤其在WEB应用中,使用 JSON lib 能够便捷地完成这项工作.JSON lib能够将Java对象转成json格式的字符串,也可以将Java对象转换成xml格 ...
- (转)json格式转换成javaBean对象的方法
把json格式转换成javaBean才可以.于是查了一下资料,网上最多的资料就是下面的这种方式: Java code? 1 2 3 4 5 6 7 8 9 String str = "[{\ ...
- js 将json对象转成字符串
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- 前台 JSON对象转换成字符串 相互转换 的几种方式
在最近的工作中,使用到JSON进行数据的传递,特别是从前端传递到后台,前台可以直接采用ajax的data函数,按json格式传递,后台Request即可,但有的时候,需要传递多个参数,后台使用requ ...
- C#中服务端接受前端JSON字符串转换成字典集合
我们是否可以把从前端接受的JSON字符串转换成字典集合呢? 比如从前端接收:{'size':'10', 'weight':'10kg'} 在服务端转换成:[{size:"10"}, ...
- json字符串转成 Map/List
package jsonToMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; import n ...
随机推荐
- drf序列化组件
rest_framework序列化之Serializer 步骤: 1.自定义一个类,继承Serializer类: 2.在类中写要序列化的字段: 3.使用:在views.py文件中,book_ser=B ...
- xls 编码 utf-8
直接用 Excel 打开 UTF-8 编码的 CSV 文件会导致汉字部分出现乱码.原因是 Excel 以 ANSI 格式打开,不会做编码识别. ==打开 UTF-8 编码的 CSV 文件的方法:1) ...
- IDEA激活方式(亲测有效)加汉化方式
2018/12/3 最新破解方法 将0.0.0.0 account.jetbrains.com保存到本地host文件中 然后使用注册码 K71U8DBPNE-eyJsaWNlbnNlSWQiOiJLN ...
- Chapter 2 Basic Elements of JAVA
elaborate:详细说明 Data TypesJava categorizes data into different types, and only certain operationscan ...
- __x__(21)0907第四天__ css 盒模型 (框模型)
CSS 处理元素,把每个元素都包含在一个盒子里. 对网页的布局,其实就是对盒子的摆放及设置. 边框border,会使盒子变大: .box{ border: 10px 20px 30px 40px r ...
- cmd 命令 net start mongodb 启动不了,提示 net 不是内部命令或者外部命令
1.要管理员的身份进入 cmd 2.右击我的电脑-->属性-->高级系统设置 3.选择高级-->环境变量 4.找到系统变量-->Path-->编辑 5.把 C:\wind ...
- SQLSERVER 聚集一个表的字段2008及以后,要求支持XML
将以下代码中的TABLE_NAME替换成所需表名称即可. 注意 declare 和set 语句后面不要有 :否则可能执行不成功 declare @S_Column varchar(8000)set @ ...
- css学习_css BFC特性(块级格式化上下文)
块级元素会有bfc条件------可以触发bfc--------利用bfc的特性来解决一些问题 1.什么是BFC? 就是一个封闭独立的渲染的区域 2.什么元素会有BFC的条件? ---块级元素会有,行 ...
- transform:translate(-50%,-50%)实现水平垂直居中
.content { padding:10px; background:green; color:#fff; position:absolute; top:50%; ...
- Exp3 免杀原理与实践 20164320 王浩
一.实验内容 1.1 正确使用msf编码器(0.5分),msfvenom生成如jar之类的其他文件(0.5分),veil-evasion(0.5分),加壳工具(0.5分),使用shellcode编程( ...