[일일 업무 개발] 일반적으로 사용되는 JSON 라이브러리 API
지손
GSON은 Java 객체와 JSON 데이터 간의 매핑을 위해 Google에서 제공하는 Java 클래스 라이브러리로, Json 문자를 Java 객체로 빠르게 변환하거나 Java 객체를 Json 문자열로 변환할 수 있습니다. SpringBoot에는 기본적으로 gson에 대한 버전 제어가 이미 있습니다. 버전 version은 부트의 기본 버전을 재정의하도록 지정할 수 있습니다.
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.6</version>
</dependency>
Json 문자열에 대한 Java 객체(직렬화)
문자열 toJson(Object src) | 지정된 개체를 동등한 Json 표현으로 직렬화합니다. 이 메서드는 지정된 개체가 일반 유형이 아닌 경우 사용해야 합니다. 개체가 일반 유형인 경우 toJson(object,type)을 대신 사용하세요. |
---|---|
문자열 toJson(Object src, 유형 typeOfSrc) | 지정된 개체(일반 유형의 개체 포함)를 동등한 Json 표현으로 직렬화합니다. 일반 개체가 아닌 경우 {@link#toJson(Object)}를 대신 사용하세요. |
문자열 toJson(JsonElement jsonElement) | JsonElement를 동등한 JSON 표현으로 변환합니다. |
JsonElement toJsonTree(Object src) | 지정된 개체를 JsonElement의 동등한 표현으로 직렬화합니다. 이 메서드는 지정된 개체가 일반 유형이 아닌 경우 사용해야 합니다. 개체가 일반 유형인 경우 대신 {@link#toJsonTree(object, type)}를 사용하세요. |
@Data
public class Teacher {
private Integer id;
private String name;
List<Student> students;
}
@Data
public class Student {
private Integer id;
private String name;
private Integer age;
}
@Test
public void testToJson() {
Teacher teacher = new Teacher();
Student student = new Student();
ArrayList<Student> students = new ArrayList<>();
student.setId(1001);
student.setName("SpringBoot");
student.setAge(20);
students.add(student);
teacher.setId(1);
teacher.setName("Spring");
teacher.setStudents(students);
Gson gson = new Gson();
String str = gson.toJson(teacher);
System.out.println(str);
}
Json 문자열을 Java 객체로(역직렬화)
T fromJson(문자열 json, 클래스 classOfT) | 지정된 Json을 지정된 클래스의 객체로 역직렬화합니다. 지정된 클래스가 제네릭 형식인 경우 fromJson(String, Type) 메서드를 사용합니다. |
---|---|
T fromJson(문자열 json, 유형 typeOfT) | 지정된 Json을 지정된 유형의 개체로 역직렬화합니다. 이 방법은 지정된 개체가 일반 유형인 경우에 유용합니다. 일반이 아닌 개체의 경우 대신 fromJson(String json, Class classOfT)를 사용하십시오. |
T fromJson(JsonElement json, Class classOfT) | 지정된 json 요소를 지정된 유형의 객체로 역직렬화합니다. 지정된 클래스가 일반 유형인 경우 fromJson(JsonElement, Type) 메서드를 사용합니다. |
T fromJson(JsonElement json, 유형 typeOfT) | |
T fromJson(리더 json, 클래스 classOfT) | |
T fromJson(리더 json, 유형 typeOfT) | 지정된 문자 입력 스트림에서 읽은 Json을 지정된 클래스의 개체로 역직렬화합니다. |
/**
* fromJson方法做与 toJson 相反的操作,将 json 格式的字符串转为基本数据类型、 POJO 对象、List、Map 、JsonElement 等
*/
@Test
public void testFromJson() {
String str = "{\"id\":1,\"name\":\"Spring\",\"students\":[{\"id\":1001,\"name\":\"SpringBoot\",\"age\":20}]}";
Gson gson = new Gson();
Teacher teacher = gson.fromJson(str, Teacher.class);
System.out.println(teacher);
}
FastJson
fastjson은 Alibaba의 오픈 소스 JSON 구문 분석 라이브러리로, JSON 형식의 문자열을 구문 분석할 수 있고 Java Bean을 JSON 문자열로 직렬화하고 JSON 문자열에서 JavaBean으로 역직렬화를 지원합니다.
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.49</version>
</dependency>
FASTJSON v2
FASTJSON
프로젝트의 중요한 업그레이드이며 성능 이 크게 향상되었으며 향후 10년 동안 FASTJSON v2
고성능 라이브러리를 제공하는 것이 목표입니다 . JSON
같은 세트를 API
통해
- JSON/JSONB 두 가지 프로토콜을 지원하며 JSONPath는 일급 시민입니다.
- 전체 분석 및 부분 분석을 지원합니다.
- Java 서버, Android 클라이언트 및 빅 데이터 시나리오를 지원합니다.
- 코틀린 지원
- Android 지원(2.0.3.android)
- Graal 네이티브 이미지(2.0.3.graal) 지원
fastjson v2는 패키지가 1.x와 다르게 com.alibaba.fastjson2 입니다 이전에 fastjson1을 사용하셨다면 대부분의 경우 패키지 이름만 바꾸시면 됩니다
<dependency>
<groupId>com.alibaba.fastjson2</groupId>
<artifactId>fastjson2</artifactId>
<version>2.0.20</version>
</dependency>
JSON**.**parseObject() | JSON 로 해결 됩니다JSONObject |
---|---|
JSON**. parseArray (**텍스트) | JSON 로 해결 됩니다JSONArray |
JSON**. parseObject ( 텍스트 ,** User.class) | 개체 JSON 로 해결 됩니다Java |
JSON**. toJSONString (**데이터); | Java 개체를 다음과 같이 직렬화합니다.JSON |
Json 문자열에 대한 Java 객체(직렬화)
@Test
public void testToJSONString() {
Teacher teacher = new Teacher();
Student student = new Student();
ArrayList<Student> students = new ArrayList<>();
student.setId(1001);
student.setName("SpringBoot");
student.setAge(20);
students.add(student);
teacher.setId(1);
teacher.setName("Spring");
teacher.setStudents(students);
String string = JSON.toJSONString(teacher);
System.out.println(string);
}
Json 문자열을 Java 객체로(역직렬화)
@Test
public void testParseObject() {
String str = "{\"id\":1,\"name\":\"Spring\",\"students\":[{\"id\":1001,\"name\":\"SpringBoot\",\"age\":20}]}";
Teacher teacher = JSON.parseObject(str, Teacher.class);
System.out.println(teacher);
}
잭슨
Jackson은 json 직렬화 및 역직렬화를 위해 널리 사용되는 Java 오픈 소스 프레임워크입니다. Jackson 커뮤니티는 상대적으로 활발하고 업데이트 속도가 비교적 빠릅니다 Github의 통계에 따르면 Jackson은 가장 인기있는 json 파서 중 하나이며 Spring MVC의 기본 json 파서는 Jackson입니다.
잭슨은 다음과 같은 많은 장점이 있습니다.
- Jackson은 더 적은 jar 패키지에 의존하고 사용하기 쉽습니다.
- Gson과 같은 다른 Java json 프레임워크와 비교할 때 Jackson은 대용량 json 파일을 더 빠르게 구문 분석합니다.
- Jackson은 상대적으로 적은 메모리 사용량과 더 나은 성능으로 실행됩니다.
- Jackson에는 쉽게 확장하고 사용자 정의할 수 있는 유연한 API가 있습니다.
현재 최신 버전은 2.9.4이며 Jackson의 핵심 모듈은 세 부분으로 구성됩니다.
- jackson-core 코어 패키지는 JsonPaser 및 JsonGenerator를 포함하여 "흐름 모드" 구문 분석을 기반으로 관련 API를 제공합니다. Jackson의 내부 구현은 고성능 스트리밍 모드 API의 JsonGenerator와 JsonParser를 통해 json을 생성하고 파싱하는 것입니다.
- 표준 주석 기능을 제공하는 jackson-annotations 주석 패키지;
- jackson-databind 데이터 바인딩 패키지, "오브젝트 바인딩" 분석 기반 관련 API( ObjectMapper ) 및 "트리 모델" 분석 기반 관련 API(JsonNode) 제공, "오브젝트 바인딩" 분석 기반 API 및 "트리 모델" 분석 API "스트림 모드"를 기반으로 구문 분석되는 API에 의존합니다.
Json 문자열에 대한 Java 객체(직렬화)
문자열 writeValueAsString(객체 값) | 1. Java 객체(예: POJO, List, Set, Map 등)를 json 문자열로 직렬화하는 데 사용되며 객체의 속성 값이 null인 경우 기본적으로 null로 직렬화됩니다. ; null이면 반환된 직렬화된 결과도 null을 반환 |
---|---|
byte[] writeValueAsBytes(객체 값) | Java 객체를 바이트 배열로 직렬화 |
writeValue(파일 결과 파일, 객체 값) | Java 객체를 직렬화하고 지정된 파일로 출력 |
writeValue(OutputStream 출력, 객체 값) | Java 객체를 지정된 바이트 출력 스트림으로 직렬화하고 출력합니다. |
writeValue(작성자 w, 객체 값) | Java 객체를 지정된 문자 출력 스트림으로 직렬화 및 출력 |
@Test
public void testWriteValueAsString() throws JsonProcessingException {
Teacher teacher = new Teacher();
Student student = new Student();
ArrayList<Student> students = new ArrayList<>();
student.setId(1001);
student.setName("SpringBoot");
student.setAge(20);
students.add(student);
teacher.setId(1);
teacher.setName("Spring");
teacher.setStudents(students);
ObjectMapper objectMapper = new ObjectMapper();
String str = objectMapper.writeValueAsString(teacher);
System.out.println(str);
}
Json 문자열을 Java 객체로(역직렬화)
1. 보통 객체로 옮기는 방법은 objectMapper.readValue(String jsonStr, Class<T> clazz)
2. List나 Map으로 옮기는 방법은 objectMapper.readValue(String jsonStr, TypeReference<T> valueTypeRef)
다음과 같은 예를 들 수 있다.
- 목록: objectMapper.readValue(json, new TypeReference<List>() {});
- 지도: objectMapper.readValue(json, new TypeReference<Map<String, Teacher>>() {});
자바 빈 객체
T readValue(문자열 내용, 클래스 값 유형) | 1. 주어진 JSON 문자열에서 Java 객체로 역직렬화 2. 내용이 비어 있거나 null인 경우 오류가 보고됨 3. valueType은 역직렬화 결과 객체를 나타내며 POJO, List와 같은 모든 Java 객체일 수 있음 , 설정 , 지도 등 |
---|---|
T readValue(바이트[] src, 클래스 값 유형) | json 콘텐츠의 바이트 배열을 자바 객체로 역직렬화 |
T readValue(파일 소스, 클래스 값 유형) | 로컬 json 콘텐츠 파일을 자바 객체로 역직렬화 |
T readValue(InputStream src, 클래스 값 유형) | json 콘텐츠의 바이트 입력 스트림을 java 객체로 역직렬화합니다. |
T readValue(리더 src, 클래스 값 유형) | json 콘텐츠의 문자 입력 스트림을 자바 객체로 역직렬화합니다. |
T readValue(URL src, 클래스 값 유형) | 네트워크 URL 주소를 통해 json 콘텐츠를 자바 객체로 역직렬화 |
@Test
public void readValue() throws JsonProcessingException {
String str = "{\"id\":1,\"name\":\"Spring\",\"students\":[{\"id\":1001,\"name\":\"SpringBoot\",\"age\":20}]}";
ObjectMapper objectMapper = new ObjectMapper();
Teacher teacher = objectMapper.readValue(str, Teacher.class);
System.out.println(teacher);
}
목록 컬렉션 개체
첫 번째 작성 방법은 List 객체로 구문 분석할 수 있지만 LinkedHashMap 객체는 내부 엔터티 결과입니다.
public static void main(String[] args) throws JsonProcessingException {
String str = "[{\"id\":1,\"name\":\"Spring\",\"students\":[{\"id\":1001,\"name\":\"SpringBoot\",\"age\":20}]}]";
ObjectMapper objectMapper = new ObjectMapper();
List list = objectMapper.readValue(str, List.class);
System.out.println(list);
}
두 번째 작성 방법은 우리가 원하는 JavaBean 엔터티 개체로 변환할 수 있으며, 이 방법은 List 컬렉션 개체를 변환하는 데 자주 사용됩니다.
String str = "[{\"id\":1,\"name\":\"Spring\",\"students\":[{\"id\":1001,\"name\":\"SpringBoot\",\"age\":20}]}]";
ObjectMapper objectMapper = new ObjectMapper();
List<Teacher> teachers = objectMapper.readValue(str, new TypeReference<List<Teacher>>() {
});
System.out.println(teachers);
지도 객체
String str = "{\"teacher1\":{\"id\":1,\"name\":\"Spring\",\"students\":[{\"id\":1001,\"name\":\"SpringBoot\",\"age\":20}]}," +
"\"teacher2\":{\"id\":2,\"name\":\"JAVA\",\"students\":[{\"id\":1002,\"name\":\"JAVASE\",\"age\":10}]}}";
ObjectMapper objectMapper = new ObjectMapper();
Map<String, Teacher> map = objectMapper.readValue(str, Map.class);
System.out.println(map);
두 번째 작성 방법:
String str = "{\"teacher1\":{\"id\":1,\"name\":\"Spring\",\"students\":[{\"id\":1001,\"name\":\"SpringBoot\",\"age\":20}]}," +
"\"teacher2\":{\"id\":2,\"name\":\"JAVA\",\"students\":[{\"id\":1002,\"name\":\"JAVASE\",\"age\":10}]}}";
ObjectMapper objectMapper = new ObjectMapper();
Map<String, Teacher> map = objectMapper.readValue(str, new TypeReference<Map<String, Teacher>>() {
});
System.out.println(map);
Json 문자열 콘텐츠를 Json 노드 개체로 역직렬화
JsonNode readTree(문자열 콘텐츠) | JSON 문자열을 JsonNode 개체, 즉 json 노드 개체로 역직렬화합니다. |
---|---|
JsonNode readTree(URL 소스) | 네트워크의 json 파일을 json 노드 개체로 역직렬화합니다. |
JsonNode readTree(InputStream 입력) | json 파일 입력 스트림을 json 노드 개체로 역직렬화합니다. |
JsonNode readTree(바이트[] 콘텐츠) | json 바이트 배열을 json 노드 객체로 역직렬화 |
JsonNode readTree(파일 파일) | 로컬 json 파일을 json 노드 개체로 역직렬화합니다. |
Java 객체 및 Json 노드 객체 변환
T convertValue(객체 fromValue, 클래스 toValueType) | Java 객체(예: POJO, List, Map, Set 등)를 Json 노드 객체로 직렬화합니다. |
---|---|
T treeToValue(TreeNode n, 클래스 값 유형) | json 트리 노드 객체는 Java 객체(예: POJO, List, Set, Map 등)로 변환되며 TreeNode 트리 노드는 전체 json 노드 객체 모델의 루트 인터페이스입니다. |