FastJson使用中遇到的问题及解决办法
一、实体类定义的变量首字母大写,结果生成的JSON串首字母却是小写的问题
User类
import lombok.Data;
@Data
public class User {
/**
* 姓名
*/
String NAME;
/**
* 年龄
*/
Integer AGE;
public User(String name, Integer age) {
super();
NAME = name;
AGE = age;
}
}
测试类:
import com.alibaba.fastjson.JSONObject;
public class Test {
public static void main(String[] args) {
User user = new User("张三", 18);
System.out.println(JSONObject.toJSONString(user));
}
}
输入
{"aGE":18,"nAME":"张三"}
解决方法一:在实体类的变量上加@JSONField注解,修改后的User类如下:
@Data
public class User {
/**
* 姓名
*/
@JSONField(name = "NAME")
String NAME;
/**
* 年龄
*/
@JSONField(name = "AGE")
Integer AGE;
public User(String name, Integer age) {
super();
NAME = name;
AGE = age;
}
}
输出如下:
{"AGE":18,"NAME":"张三"}
解决方法二:在调用JSONObject.toJSONString()方法前加入**TypeUtils.compatibleWithJavaBean = true;**
测试类:
import com.alibaba.fastjson.JSONObject;
public class Test {
public static void main(String[] args) {
User user = new User("张三", 18);
// 开启转化后的字符串首字母大写
TypeUtils.compatibleWithJavaBean = true;
System.out.println(JSONObject.toJSONString(user));
}
}
输出如下:
{"AGE":18,"NAME":"张三"}
解决方法三:通过SerializeFilter的实现类PascalNameFilter来对其进行控制
测试类:
import com.alibaba.fastjson.JSONObject;
public class Test {
public static void main(String[] args) {
User user = new User("张三", 18);
System.out.println(JSON.toJSONString(user, new PascalNameFilter(), SerializerFeature.WriteMapNullValue));
}
}
输出如下:
{"AGE":18,"NAME":"张三"}
二、将字符串转换成JSONObject后,取某一节点再转成字符串,字段顺序和原始字符串中的顺序不一致的问题
测试类:
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
public class Test {
public static void main(String[] args) {
String str= "{\"sqid\":\"000000001\",\"sfzhm\":\"110101198506020038\",\"xm\":\"姓名\",\"sjh\":\"15184613226\",\"xdacfd\":\"01\",\"qtbz\":\"其他备注\",\"xhjqxzqh\":\"110101000000\",\"xhjdz\":\"现户籍地址\",\"cslsgzksy\":\"201801\",\"cslsgzjsy\":\"201812\",\"lsgzdwmc\":\"临时工作单位名称\",\"lsgzhjd\":\"110101000000\",\"lsgzdwsfcz\":\"1\",\"sftx\":\"1\",\"grsq\":\"个人诉求\",\"sfktgzm\":\"0\",\"lsgzdwszq\":\"110101000000\",\"sqsj\":\"20200807135600\"}";
System.out.println("转换前:"+str);
JSONObject obj = (JSONObject) JSONObject.parse(str);
System.out.println("-------------------------------------------------------");
System.out.println("转换后:"+obj.toJSONString());
}
}
输出:
转换前:{"sqid":"000000001","sfzhm":"110101198506020038","xm":"姓名","sjh":"15184613226","xdacfd":"01","qtbz":"其他备注","xhjqxzqh":"110101000000","xhjdz":"现户籍地址","cslsgzksy":"201801","cslsgzjsy":"201812","lsgzdwmc":"临时工作单位名称","lsgzhjd":"110101000000","lsgzdwsfcz":"1","sftx":"1","grsq":"个人诉求","sfktgzm":"0","lsgzdwszq":"110101000000","sqsj":"20200807135600"}
-------------------------------------------------------
转换后:{"sqsj":"20200807135600","sftx":"1","lsgzdwsfcz":"1","cslsgzjsy":"201812","cslsgzksy":"201801","sfzhm":"110101198506020038","lsgzhjd":"110101000000","sfktgzm":"0","sqid":"000000001","lsgzdwszq":"110101000000","qtbz":"其他备注","sjh":"15184613226","xm":"姓名","lsgzdwmc":"临时工作单位名称","xhjqxzqh":"110101000000","xdacfd":"01","grsq":"个人诉求","xhjdz":"现户籍地址"}
解决办法:JSONObject内部是用Hashmap来存储的,所以输出是按key的排序来的,如果要让JSONObject按固定顺序(put的顺序)排列,可以修改JSONObject的定义HashMap改为LinkedHashMap
import java.util.LinkedHashMap;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.parser.Feature;
public class Test_0811 {
public static void main(String[] args) {
String str = "{\"sqid\":\"000000001\",\"sfzhm\":\"110101198506020038\",\"xm\":\"姓名\",\"sjh\":\"15184613226\",\"xdacfd\":\"01\",\"qtbz\":\"其他备注\",\"xhjqxzqh\":\"110101000000\",\"xhjdz\":\"现户籍地址\",\"cslsgzksy\":\"201801\",\"cslsgzjsy\":\"201812\",\"lsgzdwmc\":\"临时工作单位名称\",\"lsgzhjd\":\"110101000000\",\"lsgzdwsfcz\":\"1\",\"sftx\":\"1\",\"grsq\":\"个人诉求\",\"sfktgzm\":\"0\",\"lsgzdwszq\":\"110101000000\",\"sqsj\":\"20200807135600\"}";
System.out.println("转换前:" + str);
JSONObject obj = (JSONObject) JSONObject.parse(str);
System.out.println("-------------------------------------------------------");
System.out.println("转换后:" + obj.toJSONString());
System.out.println("-------------------------------------------------------");
LinkedHashMap<String, Object> jsonMap = JSON.parseObject(str, LinkedHashMap.class, Feature.OrderedField);
JSONObject obj1 = new JSONObject(true);
obj1.putAll(jsonMap);
System.out.println("转换后:" + obj1.toJSONString());
}
}
输出:
转换前:{"sqid":"000000001","sfzhm":"110101198506020038","xm":"姓名","sjh":"15184613226","xdacfd":"01","qtbz":"其他备注","xhjqxzqh":"110101000000","xhjdz":"现户籍地址","cslsgzksy":"201801","cslsgzjsy":"201812","lsgzdwmc":"临时工作单位名称","lsgzhjd":"110101000000","lsgzdwsfcz":"1","sftx":"1","grsq":"个人诉求","sfktgzm":"0","lsgzdwszq":"110101000000","sqsj":"20200807135600"}
-------------------------------------------------------
转换后:{"sqsj":"20200807135600","sftx":"1","lsgzdwsfcz":"1","cslsgzjsy":"201812","cslsgzksy":"201801","sfzhm":"110101198506020038","lsgzhjd":"110101000000","sfktgzm":"0","sqid":"000000001","lsgzdwszq":"110101000000","qtbz":"其他备注","sjh":"15184613226","xm":"姓名","lsgzdwmc":"临时工作单位名称","xhjqxzqh":"110101000000","xdacfd":"01","grsq":"个人诉求","xhjdz":"现户籍地址"}
-------------------------------------------------------
转换后:{"sqid":"000000001","sfzhm":"110101198506020038","xm":"姓名","sjh":"15184613226","xdacfd":"01","qtbz":"其他备注","xhjqxzqh":"110101000000","xhjdz":"现户籍地址","cslsgzksy":"201801","cslsgzjsy":"201812","lsgzdwmc":"临时工作单位名称","lsgzhjd":"110101000000","lsgzdwsfcz":"1","sftx":"1","grsq":"个人诉求","sfktgzm":"0","lsgzdwszq":"110101000000","sqsj":"20200807135600"}
三、FastJson默认过滤null值,不显示null值字段
测试类:
import java.util.HashMap;
import java.util.Map;
import com.alibaba.fastjson.JSONObject;
public class Test_1105 {
public static void main(String[] args) {
Map<String, Object> map = new HashMap<String, Object>() {
{
put("age", 18);
put("name", "张三");
put("sex", null);
}
};
System.out.println(JSONObject.toJSONString(map));
}
}
输出:
{"name":"张三","age":18}
解决办法:在转换的时修改FastJson的SerializerFeature序列化属性
import java.util.HashMap;
import java.util.Map;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.serializer.SerializerFeature;
public class Test_1105 {
public static void main(String[] args) {
Map<String, Object> map = new HashMap<String, Object>(3) {
{
put("age", 18);
put("name", "张三");
put("sex", null);
}
};
System.out.println(JSONObject.toJSONString(map, SerializerFeature.WriteMapNullValue));
}
}
输出:
{"sex":null,"name":"张三","age":18}
SerializerFeature常用属性
属性 | 中文描述 |
---|---|
QuoteFieldNames | 输出key时是否使用双引号,默认为true |
WriteMapNullValue | 是否输出值为null的字段,默认为false |
WriteNullNumberAsZero | 数值字段如果为null,输出为0,而非null |
WriteNullListAsEmpty | List字段如果为null,输出为[],而非null |
WriteNullStringAsEmpty | 字符类型字段如果为null,输出为”“,而非null |
WriteNullBooleanAsFalse | Boolean字段如果为null,输出为false,而非null |
四、FastJson输出字段乱序的问题
测试类:
import com.alibaba.fastjson.JSONObject;
public class Test_110501 {
public static void main(String[] args) {
JSONObject obj = new JSONObject();
obj.put("age", 18);
obj.put("name", "张三");
obj.put("sex", "男");
obj.put("school", "北京大学");
obj.put("position", "北京");
System.out.println(obj.toJSONString());
}
}
输出:
{"school":"北京大学","sex":"男","name":"张三","position":"北京","age":18}
可以看到输出的顺序并没有按照上方定义的Map的插入字段顺序输出
解决办法:在初始化JSONObject时,使用带排序的构成函数初始化
import com.alibaba.fastjson.JSONObject;
public class Test_110501 {
public static void main(String[] args) {
JSONObject obj = new JSONObject(true);
obj.put("age", 18);
obj.put("name", "张三");
obj.put("sex", "男");
obj.put("school", "北京大学");
obj.put("position", "北京");
System.out.println(obj.toJSONString());
}
}
输出:
{"age":18,"name":"张三","sex":"男","school":"北京大学","position":"北京"}
版权声明:本文为zyt_1272999061原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。