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 패키지의 문제라는 것을 발견하고 정말 일을 그르쳤다.앞으로 최대한 잭슨이나 지슨을 쓰세요.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
스마트 폰 버전 Qiita에서 새로운 기사를 만드는 버튼을 모르기 때문에 QiitaAPI를 사용하여 어떻게 하는지 테스트오랜만에 신규 기사를 쓰려고 하면, 「작성 버튼…어디?」가 되어 전혀 발견되지 않았기 때문에, QiitaAPI와 Shortcuts로 어떻게든 한 이야기. 사용할 수 있는 도구는 스마트폰만(PC는 사용하지 않는다) S...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.