FastJson 사용 중 발생한 문제 및 해결 방법

29884 단어 JSONjson
FastJson 사용 중 발생한 문제 및 해결 방법
1. 실체 클래스가 정의한 변수의 이니셜 대문자, 결과적으로 생성된 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":"  "}

해결 방법 1: 솔리드 클래스의 변수에 @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":"  "}

해결 방법2: 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":"  "}

해결 방법 3: 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":"  "}

2. 문자열을 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으로 저장되기 때문에 출력은 키에 따라 정렬됩니다. 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 패키지의 문제라는 것을 발견하고 정말 일을 그르쳤다.앞으로 최대한 잭슨이나 지슨을 쓰세요.

좋은 웹페이지 즐겨찾기