FastJson使用中遇到的问题及解决办法

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
WriteNullListAsEmptyList字段如果为null,输出为[],而非null
WriteNullStringAsEmpty字符类型字段如果为null,输出为”“,而非null
WriteNullBooleanAsFalseBoolean字段如果为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版权协议,转载请附上原文出处链接和本声明。