首先,介绍一下fastjson。fastjson是由alibaba开源的一套json处理器。与其他json处理器(如Gson,Jackson等)和其他的Java对象序列化反序列化方式相比,有比较明显的性能优势。

maven 添加配置:

<!-- 阿里fastjson包JSON转换-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.</version>
</dependency>
String queryJson1 = JSON.toJSONString(studentQuery); //序列化
String queryJson2 = JSON.toJSONString(studentQuery, SerializerFeature.WriteDateUseDateFormat); //序列化时指定格式
String queryJson3 = JsonUtils.toJSONString(studentQuery, true); //自定义序列化格式
StudentQuery queryParam = JSON.parseObject(queryJson, StudentQuery.class); //反序列化

也可以自定义序列化JsonUtils类继承自JSON,解决序列化时字段格式和是否输出等,如下:

package com.demo.utils;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.serializer.SerializerFeature; /**
* @ProjectName: ssm.maven
* @Package: com.demo.utils
* @ClassName: JsonUtils
* @Description: 自定义JSON
* @Author: XXX
* @Date: 2019/6/21 9:57
* @Version: 1.0
*/
public class JsonUtils extends JSON {
/**
* 序列化配置
* @param object
* @param isFeatures
* @return
*/
public static String toJSONString(Object object, boolean isFeatures) {
if (isFeatures) {
SerializerFeature[] features = new SerializerFeature[];
features[] = SerializerFeature.WriteDateUseDateFormat;
features[] = SerializerFeature.WriteMapNullValue;
features[] = SerializerFeature.WriteNullStringAsEmpty;
return toJSONString(object, features);
}
else {
return toJSONString(object);
}
}
}

案例一:

后端把Long类型的数据序列化成JSON后传给前端,前端可能会出现精度丢失的情况

例如:201511200001725439 这样一个Long类型的整数,传给前端后会变成201511200001725440

fastjson将Long类型转换成String类型,解决前后端交互,Java序列化JSON丢失精度问题的方法

解决方法:

  方法一:在后台将这个Long类型的字段转换成String类型的,风险比较大。

  方法二:使用fastjson的提供的注解,@JSONField(serializeUsing = ToStringSerializer.class)

需要导入包:

import com.alibaba.fastjson.annotation.JSONField;
import com.alibaba.fastjson.serializer.ToStringSerializer;
@JSONField(serializeUsing = ToStringSerializer.class)
private Long id;

备注:  

  fastjson com.alibaba.fastjson.serializer 包下面提供了多种数据类型转换的注解。

另外自己也可以拓展这些注解,通过实现ObjectSerializer 接口来完成。

例如自定义ToStringSerializer将Long转String的代码:

import java.io.IOException;
import java.lang.reflect.Type; import com.alibaba.fastjson.serializer.JSONSerializer;
import com.alibaba.fastjson.serializer.ObjectSerializer;
import com.alibaba.fastjson.serializer.SerializeWriter; public class LongToStringSerializer implements ObjectSerializer {
public static final LongToStringSerializer instance = new LongToStringSerializer(); @Override
public void write(JSONSerializer serializer, Object object, Object fieldName, Type fieldType, int features)
throws IOException {
SerializeWriter out = serializer.out;
if (object == null) {
out.writeNull();
return;
}
String strVal = object.toString();
out.writeString(strVal);
}
}
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {

/**
* 利用fastJson替换掉jackson,且解决中文乱码问题
*/
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {

FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter();
          FastJsonConfig fastJsonConfig = new FastJsonConfig();

fastJsonConfig.setSerializerFeatures(
                           SerializerFeature.DisableCircularReferenceDetect,
                           SerializerFeature.WriteMapNullValue,
                           SerializerFeature.WriteNullNumberAsZero,
                           SerializerFeature.WriteNullStringAsEmpty,
                           SerializerFeature.WriteNullListAsEmpty,
                           SerializerFeature.WriteNullBooleanAsFalse,
                           SerializerFeature.WriteNonStringKeyAsString,
                           SerializerFeature.BrowserCompatible);

        /**
* 序列换成json时,将所有的long变成string,解决Long转json精度丢失的问题
* 因为js中得数字类型不能包含所有的java long值
*/

SerializeConfig serializeConfig = SerializeConfig.globalInstance;
          serializeConfig.put(BigInteger.class, ToStringSerializer.instance);
          serializeConfig.put(Long.class, ToStringSerializer.instance);
          serializeConfig.put(Long.TYPE, ToStringSerializer.instance);
          fastJsonConfig.setSerializeConfig(serializeConfig);


//处理中文乱码问题
          List<MediaType> fastMediaTypes = new ArrayList<>();
          fastMediaTypes.add(MediaType.APPLICATION_JSON_UTF8);


fastConverter.setSupportedMediaTypes(fastMediaTypes);
          fastConverter.setFastJsonConfig(fastJsonConfig);
          converters.add(fastConverter);

}

}

案例二:

让@ResponseBody用fastjson来序列化JSON返回到前端,如何在配置文件中设置

由于@ResponseBody返回的是默认用Jackson来序列化的,所以要让spring的消息转换器换成fastjson来序列化

这样配置解决了如下问题:

1、让@ResponseBody返回采用fastjson来序列化

2、字段类型为Date,输出为"yyyy-MM-dd HH:mm:ss"

3、是否输出值为null的字段

4、字符类型字段如果为null,输出为"",而非null

5、等等其他。。。

maven 添加配置:

<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.</version>
</dependency>

在springmvc.xml中配置@ResponseBody使用fastjson

<!-- 配置注解驱动 重新设置@RequestMapping中对@ResponseBody以String类型消息转换器的字符集 -->
<mvc:annotation-driven>
<mvc:async-support default-timeout=""/>
<mvc:message-converters register-defaults="true">
<!-- 解决Controller返回json中文乱码问题 -->
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<!-- <property name="supportedMediaTypes" value="text/html;charset=UTF-8" /> -->
<!-- <property name="supportedMediaTypes" value="application/json;charset=UTF-8" > -->
<property name="supportedMediaTypes">
<list>
<value>text/html;charset=UTF-</value>
<value>application/json;charset=UTF-</value>
<value>application/xml;charset=UTF-</value>
</list>
</property>
</bean>
<!-- 默认@ResponseBody返回的是jackson来序列化的, 所以要让spring的消息转换器换成fastjson来序列化 -->
<bean class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter">
<property name="fastJsonConfig">
<bean class="com.alibaba.fastjson.support.config.FastJsonConfig">
<!-- 序列化配置 -->
<property name="serializerFeatures">
<list value-type="com.alibaba.fastjson.serializer.SerializerFeature">
<!-- 字段类型为Date,输出为"yyyy-MM-dd HH:mm:ss" -->
<value>WriteDateUseDateFormat</value>
<!-- 是否输出值为null的字段,默认是false -->
<value>WriteMapNullValue</value>
<!-- 字符类型字段如果为null,输出为"",而非null -->
<value>WriteNullStringAsEmpty</value>
<!--<value>WriteNullNumberAsZero</value>-->
<!--<value>WriteNullListAsEmpty</value>-->
<!--<value>WriteNullBooleanAsFalse</value>-->
<!--<value>QuoteFieldNames</value>-->
</list>
</property>
</bean>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>

如果上面配置文件中只是简单配置了一下fastjson来序列化,而没有配置那些“序列化配置”项目,则需要通过在实体对象属性上加注解方式实现了

package com.demo.model.vo;

import com.alibaba.fastjson.annotation.JSONField;
import com.alibaba.fastjson.serializer.ToStringSerializer;
//import com.fasterxml.jackson.annotation.JsonFormat;
//import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import java.io.Serializable;
import java.util.Date; /**
* @ProjectName: maven
* @Package: com.demo.model.vo
* @ClassName: StudentVO
* @Description: 返回请求对象
* @Author: XXX
* @Date: 2019/6/18 10:44
* @Version: 1.0
*/
@Data
@ApiModel(value = "StudentVO", description = "返回请求对象")
public class StudentVO implements Serializable {
@ApiModelProperty(value = "主键")
@JSONField(serializeUsing = ToStringSerializer.class)
//@JsonSerialize(using = com.fasterxml.jackson.databind.ser.std.ToStringSerializer.class)
private Long id; @ApiModelProperty(value = "学生姓名")
private String name; @ApiModelProperty(value = "学生年龄")
private Integer age; @ApiModelProperty(value = "创建日期")
@JSONField(format = "yyyy-MM-dd HH:mm:ss")
//@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date createtime;
}

切记:这种配置只使用于@ResponseBody返回json格式,而不使用于通过在代码中通过JSON.toJSONString()方式来直接序列化的json,若想达到同样效果可以通过下面方式

方式一:

String queryJson = JSON.toJSONString(studentQuery, SerializerFeature.WriteDateUseDateFormat, SerializerFeature.WriteMapNullValue, SerializerFeature.WriteNullStringAsEmpty);

方式二:使用上面提到的自定义序列化类JsonUtils

String queryJson = JsonUtils.toJSONString(studentQuery, true);

com.alibaba.fastjson使用介绍的更多相关文章

  1. 全解史上最快的JOSN解析库 - alibaba Fastjson

    JSON,全称:JavaScript Object Notation,作为一个常见的轻量级的数据交换格式,应该在一个程序员的开发生涯中是常接触的.简洁和清晰的层次结构使得 JSON 成为理想的数据交换 ...

  2. Alibaba FastJson 常用方法使用指南

    介绍 FastJson是阿里巴巴的开源JSON解析库,它可以解析JSON格式的字符串,支持将Java Bean序列化为JSON字符串,也可以从JSON字符串反序列化到JavaBean. FastJso ...

  3. com.alibaba.fastjson.JSONObject循环给同一对象赋值会出现"$ref":"$[0]"现象问题

    1.今天定义了一个JSONObject对象,引用的com.alibaba.fastjson.JSONObject,循环给这个对象赋值出现"$ref":"$[0]" ...

  4. alibaba fastjson常见问题FAQ

    English | 中文 1. 怎么获得fastjson? 你可以通过如下地方下载fastjson: maven中央仓库: http://central.maven.org/maven2/com/al ...

  5. alibaba/fastjson 之 JSONPath

    JOSNPath 是一个非常强大的工具,对于处理 json 对象非常方便. 官方地址:https://github.com/alibaba/fastjson/wiki/JSONPath 基本用法:ht ...

  6. fastjson序列化和反序列化报com.alibaba.fastjson.JSONException: autoType is not support异常问题,解决方案整合

    1.问题起因 2017年3月15日,fastjson官方发布安全升级公告,该公告介绍fastjson在1.2.24及之前的版本存在代码执行漏洞,当恶意攻击者提交一个精心构造的序列化数据到服务端时,由于 ...

  7. 解决使用Redis时配置 fastjson反序列化报错 com.alibaba.fastjson.JSONException: autoType is not support

    1.问题描述 在使用redis时,配置自定义序列化redisTemplate为FastJsonRedisSerializer .  1 /** 2 * 自定义redis序列化器 3 */ 4 @Sup ...

  8. alibaba fastjson List<Map<String, String>>2Str

    import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map; impo ...

  9. Alibaba FastJson

    import com.alibaba.fastjson.JSON import com.alibaba.fastjson.JSONObject class Test { static main(arg ...

随机推荐

  1. 《exception》第九次团队作业:Beta冲刺与验收准备(大结局)

    一.项目基本介绍 项目 内容 这个作业属于哪个课程 任课教师博客主页链接 这个作业的要求在哪里 作业链接地址 团队名称 Exception 作业学习目标 1.掌握软件黑盒测试技术:2.学会编制软件项目 ...

  2. Linux——安装并配置Kafka

    前言 Kafka是由Apache软件基金会开发的一个开源流处理平台,由Scala和Java编写.Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者规模的网站中的所有动作流数据. 这种动 ...

  3. sass环境搭建之node-sass,ruby

    该内容全部为搬运,感谢作者的分享~,附有原文链接. 使用ruby环境 SASS学习系列之(一)--------- SASS,SCSS环境搭建(Ruby) 使用node-sass SASS学习系列之(二 ...

  4. springcloud(二)

    springcloud路由网关 一.什么是网关 Zuul的主要功能是路由转发和过滤器.路由功能是微服务的一部分,比如/api/user转发到到user服务,/api/shop转发到到shop服务.zu ...

  5. Java web开发——文件夹的上传和下载

    我们平时经常做的是上传文件,上传文件夹与上传文件类似,但也有一些不同之处,这次做了上传文件夹就记录下以备后用. 这次项目的需求: 支持大文件的上传和续传,要求续传支持所有浏览器,包括ie6,ie7,i ...

  6. WinDbg常用命令系列---.write_cmd_hist (写命令历史记录)

    .write_cmd_hist 简介 .write_cmd_hist命令将调试器命令窗口的整个历史记录写入文件. 使用形式 .write_cmd_hist Filename 参数 Filename指定 ...

  7. 有效的minidump(二)

    函数MiniDumpCallback 如果要自定义MINIDUMP类型标志无法访问的MINIDUMP的内容,可以使用MiniDumpCallback函数.这是一个用户定义的回调,当MiniDumpWr ...

  8. linux命令之------Tar解压缩

    Tar解压缩 作用:将解压缩后缀名为tar的压缩包 -f<备份文件>或—file=<备份文件>指定备份文件 -v或-verbose显示指令执行过程 -x或-extract或-g ...

  9. 解决IE报错:Locale 'chinese' is not well-formed,或RangeError: 区域设置“chinese”的格式不正确的问题

    接之前的此博客问题处理:js处理时间时区问题 由于 toLocaleString():据本地时间格式,把 Date 对象转换为字符串.总是会带有上午/下午,所以我加了参数:new Date('2019 ...

  10. 18年今日头条笔试第一题题解:球迷(fans)

    其实本题是加强版,原数据是100*100的,老师为了尊重我们的智商加成了3000*3000并进行了字符串处理…… 上原题~ 球迷 [问题描述] 一个球场C的球迷看台可容纳M*N个球迷.官方想统计一共有 ...