"Chào, Amigo!"

"Chào, Ellie!"

"Vì bạn đã được giới thiệu về JSON, nên hôm nay chúng ta hãy nói nhiều hơn về nó."

"OK. Nó thường được sử dụng ở đâu?"

"Đây là cách nó thường hoạt động. Ai đó (máy khách) yêu cầu dữ liệu từ một chương trình Java (máy chủ). Chương trình tạo các đối tượng Java và điền vào chúng thông tin từ cơ sở dữ liệu. Sau đó, nó chuyển đổi chúng thành định dạng mà người yêu cầu (máy khách ) có thể hiểu được, chẳng hạn như JSON và gửi chúng trở lại."

"Để tôi cho bạn biết cách làm việc với JSON trong Java. Về cơ bản, chúng ta chỉ cần thực hiện hai việc: tuần tự hóa các đối tượng Java thành định dạng JSON và giải tuần tự hóa các đối tượng Java từ định dạng JSON."

"Nói cách khác, JSON là một tiêu chuẩn để gửi tin nhắn/dữ liệu từ chương trình này sang chương trình khác. Có rất nhiều tiêu chuẩn như vậy. Nhưng nếu chương trình được viết bằng JavaScript, thì nó thường cố gắng sử dụng JSON."

"OK. Tôi đã sẵn sàng."

"Tuyệt. Vậy thì bắt đầu thôi."

Tuần tự hóa thành JSON - 1

"Như bạn đã biết, Java có các công cụ tuần tự hóa tiêu chuẩn tích hợp sẵn. Nhưng chúng không hỗ trợ JSON. Vì vậy, nếu bạn cần tuần tự hóa một đối tượng thành JSON, bạn có thể sử dụng một trong các khung (thư viện) phổ biến biết cách làm cái này."

"Sự khác biệt giữa các khuôn khổ khác nhau này là gì?"

"Chúng thường khác nhau về mức độ phức tạp: có những khung chỉ có thể thực hiện những điều rất cơ bản, nhưng chúng lại rất nhỏ và đơn giản. Và có những khung phức tạp lớn có thể làm được nhiều hơn thế."

"Jackson là một trong những framework phổ biến nhất. Chúng tôi sẽ sử dụng nó làm ví dụ khi xem xét cách làm việc với JSON."

"Trước tiên, bạn cần tải xuống khung này và thêm nó vào dự án của mình. Bạn cần thực hiện việc này trực tiếp trong IntelliJ IDEA. Bạn có thể tải xuống khung bằng liên kết này ."

"Xong."

"Tuyệt. Vậy thì tiếp tục nào."

"Chuyển đổi một đối tượng Java thành JSON cũng dễ như tuần tự hóa nó. Để làm điều này, có một lớp ObjectMapper đặc biệt (com.fasterxml.jackson.databind.ObjectMapper)."

"Hãy để tôi chỉ cho bạn một ví dụ hoạt động, và sau đó chúng ta sẽ phân tích nó:"

Chuyển đổi một đối tượng thành 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);
}
Một lớp Cat có các đối tượng chuyển đổi thành JSON
@JsonAutoDetect
class Cat
{
 public String name;
 public int age;
 public int weight;
Cat(){}
}
Kết quả tuần tự hóa và đầu ra màn hình:
{"name":"Missy", "age":5, "weight":4}

"Đây là cách nó hoạt động:"

"Trong các dòng 4-7, chúng tôi tạo một đối tượng Cat và điền dữ liệu vào đó."

"Ở dòng 10, chúng ta tạo một đối tượng Writer, nơi chúng ta sẽ viết một biểu diễn chuỗi JSON của đối tượng."

"Trong dòng 13, chúng tôi tạo một đối tượng ObjectMapper sẽ thực hiện tất cả việc tuần tự hóa."

"Ở dòng 16, chúng tôi viết biểu diễn JSON của đối tượng mèo cho nhà văn ."

"Ở dòng 19-20, chúng tôi hiển thị kết quả trên màn hình."

"Mọi thứ trông khá đơn giản. Không khó hơn so với tuần tự hóa gốc trong Java."

"Khử lưu huỳnh sẽ trông như thế nào?"

"Nó gần giống nhau, chỉ ngắn hơn:"

Chuyển đổi một đối tượng từ 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);
}
Một lớp có các đối tượng được giải tuần tự hóa từ định dạng JSON
@JsonAutoDetect
class Cat
{
 public String name;
 public int age;
 public int weight;

 Cat() { }
}

"Thậm chí còn dễ dàng hơn. Chúng tôi lấy ObjectMapper và truyền cho nó một chuỗi hoặc một StringReader với JSON, cũng như lớp của đối tượng được giải tuần tự hóa . Sau đó, chúng tôi gọi phương thức readValue và khi xuất ra, chúng tôi nhận được một đối tượng Java làm sẵn với tất cả dữ liệu."

"Chà, điều đó chính xác giống như quá trình khử lưu huỳnh trong Java."

"Hầu hết. Có một số yêu cầu được đặt trên các đối tượng được tuần tự hóa hoặc giải tuần tự hóa từ JSON:"

" 1)  các trường phải hiển thị: chúng phải ở chế độ công khai hoặc có getters và setters"

" 2)  phải có hàm tạo mặc định (không có tham số)"

"Tôi hiểu rồi. Điều đó không quá ngạc nhiên. Nhưng Java đã tuần tự hóa mọi thứ, kể cả các trường riêng tư."

"Chà, đó là Java. Nó có quyền truy cập vào dữ liệu ẩn. Bạn không thể ẩn mình được."

"Có khía cạnh thứ ba ở đây. Tôi hy vọng bạn đã chú ý đến chú thích @JsonAutoDetect trên lớp Cat?"

"Ừ. Tôi vừa định hỏi nó là cái gì."

"Đó là một chú thích: thông tin vệ sinh cho khung Jackson. Bằng cách sử dụng các chú thích phù hợp, bạn có khá nhiều quyền kiểm soát linh hoạt đối với kết quả tuần tự hóa thành JSON."

"Tuyệt! Có những loại chú thích nào?"

"Dưới đây là một vài ví dụ:"

Chú thích Sự miêu tả
@JsonAutoDetect Đặt trước một lớp học.
Đánh dấu một lớp là đã sẵn sàng để được tuần tự hóa thành JSON.
@JsonBỏ qua Được đặt trước một thuộc tính.
Thuộc tính sẽ bị bỏ qua trong quá trình tuần tự hóa.
@JsonProperty Được đặt trước một thuộc tính hoặc một getter hoặc setter. Cho phép bạn chỉ định một tên trường khác trong quá trình tuần tự hóa.
@JsonWriteNullProperties Đặt trước một lớp học.
Các trường đối tượng không có giá trị sẽ không bị bỏ qua.
@JsonPropertyOrder Đặt trước một lớp học.
Cho phép bạn chỉ định thứ tự trường trong quá trình tuần tự hóa.

"Thật thú vị! Còn nữa không?"

"Có rất nhiều. Nhưng chúng ta sẽ không đề cập đến chúng ngay bây giờ. Bây giờ hãy làm lại ví dụ đầu tiên của chúng ta một chút:"

Chuyển đổi một đối tượng thành 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);
}
Một lớp có các đối tượng chuyển đổi thành JSON
@JsonAutoDetect
class Cat
{
 @JsonProperty("alias")
 public String name;
 public int age;
 @JsonIgnore
 public int weight;

 Cat() {
 }
}
Kết quả tuần tự hóa và đầu ra màn hình:
{"age":5, "alias":"Missy"}

"Mã vẫn giữ nguyên, nhưng tôi đã thay đổi chú thích: Tôi đã chỉ định một tên khác cho trường tên: bí danh. Tôi cũng đánh dấu trường trọng số là Bỏ qua, điều này khiến đối tượng JSON thay đổi."

"Thật tốt khi bạn có thể tùy chỉnh mọi thứ như vậy. Tôi nghĩ tôi chắc chắn sẽ thấy điều này hữu ích."

"Và giải tuần tự hóa sẽ hiểu cách làm việc với điều này? Khi giải tuần tự hóa từ JSON sang một đối tượng Java, giá trị của trường bí danh sẽ được ghi vào trường tên của đối tượng Cat?"

"Vâng, quá trình khử lưu huỳnh sẽ hoạt động bình thường. Thật thông minh."

"Vậy thì có gì mà không vui."

"Cảm ơn vì bài học thú vị này, Ellie."