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还是有很多问题的,开发中自己代码写的明明没有问题,结果程序就是报错,还要一点一点的打断点调试,最后发现原来是FastJson工具包的问题,真的很耽误事。以后还是尽量用JackSon或Gson吧。

你可能感兴趣的:(JSON,json)