"안녕, 아미고!"

"안녕, 엘리!"

"이미 JSON에 대해 소개했으므로 오늘 더 자세히 이야기해 봅시다."

"알았어. 보통 어디에서 쓰니?"

"일반적으로 작동하는 방식은 다음과 같습니다. 누군가(클라이언트)가 Java 프로그램(서버)에서 데이터를 요청합니다. 프로그램은 Java 객체를 생성하고 데이터베이스의 정보로 채웁니다. 그런 다음 요청자(클라이언트)가 원하는 형식으로 변환합니다. )는 JSON과 같이 이해할 수 있으며 이를 다시 보냅니다."

"Java에서 JSON으로 작업하는 방법을 알려드리겠습니다. 기본적으로 Java 개체를 JSON 형식으로 직렬화하고 Java 개체를 JSON 형식에서 역직렬화하는 두 가지 작업만 수행하면 됩니다."

"즉, JSON은 한 프로그램에서 다른 프로그램으로 메시지/데이터를 보내는 표준입니다. 그런 표준이 많이 있습니다. 하지만 프로그램이 JavaScript로 작성된 경우 일반적으로 JSON을 사용하려고 합니다."

"좋아. 준비됐어."

"좋습니다. 그럼 시작하겠습니다."

JSON으로 직렬화 - 1

"이미 아시다시피 Java에는 표준 직렬화 도구가 내장되어 있습니다. 하지만 JSON을 지원하지 않습니다. 따라서 개체를 JSON으로 직렬화해야 하는 경우 방법을 알고 있는 인기 있는 프레임워크(라이브러리) 중 하나를 사용할 수 있습니다. 이 작업을 수행."

"이러한 다른 프레임워크의 차이점은 무엇입니까?"

"일반적으로 복잡성 수준이 다릅니다. 아주 기본적인 것만 수행할 수 있는 프레임워크가 있지만 매우 작고 단순합니다. 그리고 훨씬 더 많은 작업을 수행할 수 있는 크고 복잡한 프레임워크가 있습니다."

"Jackson은 가장 인기 있는 프레임워크 중 하나입니다. JSON으로 작업하는 방법을 살펴볼 때 이를 예로 사용할 것입니다."

"먼저 이 프레임워크를 다운로드하고 프로젝트에 추가해야 합니다. IntelliJ IDEA에서 직접 이 작업을 수행해야 합니다. 이 링크를 사용하여 프레임워크를 다운로드할 수 있습니다 . "

"완료."

"좋아. 그럼 계속하자."

"Java 개체를 JSON으로 변환하는 것은 직렬화하는 것만큼 쉽습니다. 이를 위해 특별한 ObjectMapper 클래스(com.fasterxml.jackson.databind.ObjectMapper)가 있습니다."

"실제 예제를 보여드리고 분석하겠습니다."

개체를 JSON으로 변환"
public static void main(String[] args) throws IOException
{
 // Create an object to be serialized into JSON
 Cat cat = new Cat();
 cat.name = "Missy";
 cat.age = 5;
 cat.weight = 4;

 // Write the result of the serialization to a StringWriter
 StringWriter writer = new StringWriter();

 // This is the Jackson object that performs the serialization
 ObjectMapper mapper = new ObjectMapper();

 // And here's the serialization itself: the first argument is where, and the second is what
 mapper.writeValue(writer, cat);

 // Convert everything written to the StringWriter into a String
 String result = writer.toString();
 System.out.println(result);
}
개체가 JSON으로 변환되는 Cat 클래스
@JsonAutoDetect
class Cat
{
 public String name;
 public int age;
 public int weight;
Cat(){}
}
직렬화 결과 및 화면 출력:
{"name":"Missy", "age":5, "weight":4}

"작동 방식은 다음과 같습니다."

"4-7행에서 Cat 개체를 만들고 데이터로 채웁니다."

"10행에서 개체의 JSON 문자열 표현을 작성할 Writer 개체를 만듭니다."

"13번째 줄에서 모든 직렬화를 수행할 ObjectMapper 개체를 만듭니다 ."

"16번째 줄에서 cat 개체의 JSON 표현을 writer 에 씁니다 ."

"19-20행에서 결과를 화면에 표시합니다."

"모든 것이 매우 단순해 보입니다. Java의 기본 직렬화보다 어렵지 않습니다."

"역직렬화는 어떤 모습일까요?"

"거의 똑같습니다. 더 짧습니다."

JSON에서 개체 변환
public static void main(String[] args) throws IOException
{
 String jsonString = "{ \"name\":\"Missy\", \"age\":5, \"weight\":4}";
 StringReader reader = new StringReader(jsonString);

 ObjectMapper mapper = new ObjectMapper();

 Cat cat = mapper.readValue(reader, Cat.class);
}
개체가 JSON 형식에서 역직렬화되는 클래스
@JsonAutoDetect
class Cat
{
 public String name;
 public int age;
 public int weight;

 Cat() { }
}

"훨씬 더 쉽습니다. 우리는 ObjectMapper를 가져와 JSON과 함께 문자열 또는 StringReader와 역 직렬화할 개체 의 클래스를 전달합니다. 그런 다음 readValue 메서드를 호출 하고 출력으로 다음과 같은 기성품 Java 개체를 얻습니다. 모든 데이터."

"글쎄요, 자바의 역직렬화와 똑같습니다."

"거의. JSON으로 직렬화되거나 JSON에서 역직렬화되는 개체에 대한 몇 가지 요구 사항이 있습니다."

" 1)  필드가 표시되어야 합니다. 공개 필드이거나 getter 및 setter가 있어야 합니다."

" 2)  기본 생성자가 있어야 합니다(매개변수가 없는 생성자)"

"그렇군요. 그리 놀라운 일은 아닙니다. 하지만 Java는 모든 것을 직렬화했습니다. 비공개 필드까지요."

"글쎄요, 그건 자바였습니다. 숨겨진 데이터에 접근할 수 있습니다. 당신 자신에게서 숨길 수 없습니다."

"여기에 세 번째 측면이 있습니다. Cat 클래스에서 @JsonAutoDetect 주석을 보셨기를 바랍니다."

"네. 그게 뭐냐고 물어보려던 참이었어요."

"이것은 주석입니다. Jackson 프레임워크에 대한 관리 정보입니다. 올바른 주석을 사용하면 JSON으로의 직렬화 결과를 상당히 유연하게 제어할 수 있습니다."

"멋지다! 어떤 종류의 주석이 있습니까?"

"다음은 몇 가지 예입니다."

주석 설명
@JsonAutoDetect 수업 전에 배치됩니다.
클래스를 JSON으로 직렬화할 준비가 된 것으로 표시합니다.
@Json무시 속성 앞에 배치됩니다.
이 속성은 직렬화 중에 무시됩니다.
@JsonProperty 속성이나 getter 또는 setter 앞에 배치됩니다. 직렬화 중에 다른 필드 이름을 지정할 수 있습니다.
@JsonWriteNullProperties 수업 전에 배치됩니다.
null인 개체 필드는 무시되지 않습니다.
@JsonPropertyOrder 수업 전에 배치됩니다.
직렬화 중에 필드 순서를 지정할 수 있습니다.

"재미있다! 더 있어?"

"많습니다. 하지만 지금은 다루지 않겠습니다. 이제 첫 번째 예를 약간 수정해 보겠습니다."

개체를 JSON으로 변환
public static void main(String[] args) throws IOException
{
 Cat cat = new Cat();
 cat.name = "Missy";
 cat.age = 5;
 cat.weight = 4;

 StringWriter writer = new StringWriter();

 ObjectMapper mapper = new ObjectMapper();

 mapper.writeValue(writer, cat);

 String result = writer.toString();
 System.out.println(result);
}
개체가 JSON으로 변환되는 클래스
@JsonAutoDetect
class Cat
{
 @JsonProperty("alias")
 public String name;
 public int age;
 @JsonIgnore
 public int weight;

 Cat() {
 }
}
직렬화 결과 및 화면 출력:
{"age":5, "alias":"Missy"}

"코드는 동일하게 유지되지만 주석을 변경했습니다. 이름 필드에 별칭을 다른 이름으로 지정했습니다. 또한 가중치 필드를 무시로 표시하여 JSON 개체가 변경되었습니다."

"모든 것을 이렇게 커스터마이즈할 수 있어서 좋습니다. 확실히 유용할 것 같아요."

"역직렬화는 이것으로 작업하는 방법을 이해할 것입니까? JSON에서 Java 개체로 역직렬화할 때 별칭 필드의 값이 Cat 개체의 이름 필드에 기록됩니까?"

"예, 역직렬화가 제대로 작동할 것입니다. 똑똑합니다."

"그럼 기쁘지 않을 게 뭐야."

"흥미로운 수업 감사합니다, Ellie."