从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的遇到的问题的更多相关文章

  1. 使用jackson来进行数组格式的json字符串转换成List。

    有一个字符串如下.如下,也是通过jackson把list转换成的json字符串,我想把它转过来,看网上的内容都不尽人如意,都是片断的内容.估计只有写的知道怎么使用,所以就直接看了jackson的官网, ...

  2. Atitit.json类库的设计与实现 ati json lib

    Atitit.json类库的设计与实现 ati json lib 1. 目前jsonlib库可能有问题,可能版本冲突,抛出ex1 2. 解决之道:1 2.1. 自定义json解析库,使用多个复合的js ...

  3. Java json工具类,jackson工具类,ObjectMapper工具类

    Java json工具类,jackson工具类,ObjectMapper工具类 >>>>>>>>>>>>>>> ...

  4. 使用JsonConfig控制JSON lib序列化

    将对象转换成字符串,是非常常用的功能,尤其在WEB应用中,使用 JSON lib 能够便捷地完成这项工作.JSON lib能够将Java对象转成json格式的字符串,也可以将Java对象转换成xml格 ...

  5. (转)json格式转换成javaBean对象的方法

    把json格式转换成javaBean才可以.于是查了一下资料,网上最多的资料就是下面的这种方式: Java code? 1 2 3 4 5 6 7 8 9 String str = "[{\ ...

  6. js 将json对象转成字符串

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  7. 前台 JSON对象转换成字符串 相互转换 的几种方式

    在最近的工作中,使用到JSON进行数据的传递,特别是从前端传递到后台,前台可以直接采用ajax的data函数,按json格式传递,后台Request即可,但有的时候,需要传递多个参数,后台使用requ ...

  8. C#中服务端接受前端JSON字符串转换成字典集合

    我们是否可以把从前端接受的JSON字符串转换成字典集合呢? 比如从前端接收:{'size':'10', 'weight':'10kg'} 在服务端转换成:[{size:"10"}, ...

  9. json字符串转成 Map/List

    package jsonToMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; import n ...

随机推荐

  1. DAPP 开发直通车-如何基于NEL 轻钱包来开发DAPP

    之前做了 DAPP 开发直通车,通讲了一下开发一个DAPP的过程.   但是涉及多工种,多步骤.入手还是非常困难的.   经过不懈的努力,做了很多铺垫工作之后,我终于可以告诉你:   开发DAPP f ...

  2. 我的 FPGA 学习历程(06)—— 二进制转格雷码

    格雷码是一种无权编码,其特点是相邻的两数之间只有一个位不同,像这样: 000-->001-->011-->010-->110-->111-->101-->10 ...

  3. 修改终端terminal

    修改终端路径 显示的颜色 (1)在home目录中,新建 .dircolors: $vi .dircolors 输入下面内容 DIR 00;36 保存退出. (2)在 .bashrc文件中 $vi .b ...

  4. [LeetCode] Friends Of Appropriate Ages 适合年龄段的朋友

    Some people will make friend requests. The list of their ages is given and ages[i] is the age of the ...

  5. hook NtTerminateProcess进行应用的保护

    这段时间在学习驱动,然后看到hook ssdt的代码,找了一个写的清晰的学习了一下:http://www.netfairy.net/?post=218 这里是hook NtOpenProcess,但是 ...

  6. Tomcat报错invalid LOC header

    原因: 可能是jar包有问题. 解决方法: 1.找到加载不了的类对应的jar包. 2.在tomcat中webapps/INF/lib中找到对应的jar包,然后删除. 3.重新下载其它版本的jar包. ...

  7. python模拟---注册登陆查看个人信息

    需求:1.模拟注册: 2.模拟登陆: 3.模拟登陆成功显示登陆成功的用户账号: 一.注册 代码如下: def regetist(): ''' :param username: 注册的账号 :param ...

  8. 课堂笔记及知识点----栈和队列(2018/10/24(am))

    栈: Stack<int>  xt=new Stack<int>() ; 先进后出,后进先出,水杯结构,顺序表类似 常用方法:   .pop---->出栈,弹栈     ...

  9. Selenium 3----获取断言信息

    断言:把实际结果与预期进行比较. 一般可以通过获取title .URL和text等信息进行断言. title:用于获得当前页面的标题. current_url:用户获得当前页面的URL. text:获 ...

  10. python3 文件读写操作中的文件指针seek()使用

    python中可以使用seek()移动文件指针到指定位置,然后读/写.通常配合 r+ .w+.a+ 模式,在此三种模式下,seek指针移动只能从头开始移动,即seek(x,0) . 模式 默认 写方式 ...