“สวัสดี อามีโก้!”

“สวัสดี เอลลี่!”

"เนื่องจากคุณได้รู้จักกับ JSON แล้ว เรามาพูดถึงเรื่องนี้ให้มากขึ้นกันเถอะ"

"ตกลง ปกติใช้ที่ไหน"

"นี่คือวิธีการทำงาน มีคน (ลูกค้า) ขอข้อมูลจากโปรแกรม Java (เซิร์ฟเวอร์) โปรแกรมสร้างวัตถุ Java และเติมข้อมูลจากฐานข้อมูล จากนั้นจะแปลงให้เป็นรูปแบบที่ผู้ร้องขอ (ลูกค้า ) สามารถเข้าใจ เช่น JSON และส่งกลับ"

"ให้ฉันบอกคุณถึงวิธีการทำงานกับ JSON ใน Java โดยพื้นฐานแล้ว เราต้องทำสองสิ่งเท่านั้น: ทำให้วัตถุ 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);
}
คลาส Cat ที่วัตถุแปลงเป็น JSON
@JsonAutoDetect
class Cat
{
 public String name;
 public int age;
 public int weight;
Cat(){}
}
ผลการทำให้เป็นอันดับและเอาต์พุตหน้าจอ:
{"name":"Missy", "age":5, "weight":4}

"นี่คือวิธีการทำงาน:"

"ในบรรทัดที่ 4-7 เราสร้าง วัตถุ Catและเติมข้อมูล"

"ในบรรทัดที่ 10 เราสร้างออบเจกต์ Writer ซึ่งเราจะเขียนการแทนค่าสตริง JSON ของออบเจ็กต์"

"ในบรรทัดที่ 13 เราสร้าง วัตถุ ObjectMapperที่จะทำการซีเรียลไลเซชันทั้งหมด"

"ในบรรทัดที่ 16 เราเขียนการแสดง JSON ของcat object ถึง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และส่งผ่านสตริงหรือ StringReader กับ JSON รวมถึงคลาสของอ็อบเจกต์ที่จะดีซีเรียลไลซ์จากนั้นเราเรียกเมธอดreadValueและเมื่อเราได้เอาต์พุตเป็นอ็อบเจกต์ Java สำเร็จรูปที่มี ข้อมูลทั้งหมด"

"นั่นก็เหมือนกับการดีซีเรียลไลเซชันใน Java"

"เกือบแล้ว มีข้อกำหนดหลายข้อที่วางอยู่บนออบเจกต์ที่ซีเรียลไลซ์เป็นหรือดีซีเรียลไลซ์จาก JSON:"

" 1)  ฟิลด์ต้องมองเห็นได้: ต้องเป็นสาธารณะหรือมี getters และ setters"

" 2)  ต้องมีตัวสร้างเริ่มต้น (ตัวที่ไม่มีพารามิเตอร์)"

"เข้าใจแล้ว ไม่น่าแปลกใจเลย แต่ Java ทำให้ทุกอย่างเป็นอนุกรม แม้แต่ฟิลด์ส่วนตัว"

"นั่นคือ Java มันเข้าถึงข้อมูลที่ซ่อนอยู่ คุณไม่สามารถซ่อนจากตัวคุณเองได้"

"มีแง่มุมที่สามอยู่ที่นี่ ฉันหวังว่าคุณจะสังเกตเห็นคำอธิบายประกอบ @JsonAutoDetect ในคลาส Cat"

“ใช่ ฉันแค่กำลังจะถามว่ามันคืออะไร”

"มันเป็นคำอธิบายประกอบ: ข้อมูลการดูแลทำความสะอาดสำหรับกรอบงาน Jackson การใช้คำอธิบายประกอบที่ถูกต้อง คุณจะสามารถควบคุมผลลัพธ์ของการทำให้เป็นอันดับเป็น JSON ได้ค่อนข้างยืดหยุ่น"

"เจ๋ง! มีคำอธิบายประกอบแบบใด"

"นี่คือตัวอย่างบางส่วน:"

คำอธิบายประกอบ คำอธิบาย
@JsonAutoDetect วางไว้ก่อนชั้นเรียน
ทำเครื่องหมายคลาสว่าพร้อมที่จะซีเรียลไลซ์เป็น JSON
@JsonIgnore วางไว้หน้าทรัพย์สิน
คุณสมบัติจะถูกละเว้นในระหว่างการทำให้เป็นอนุกรม
@เจสัน พร็อพเพอร์ตี้ วางไว้หน้าคุณสมบัติหรือตัวรับหรือตัวตั้ง ให้คุณระบุชื่อฟิลด์อื่นในระหว่างการทำให้เป็นอนุกรม
@JsonWriteNullProperties วางไว้ก่อนชั้นเรียน
ช่องวัตถุที่เป็นค่าว่างจะไม่ถูกละเว้น
@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"}

"โค้ดยังคงเหมือนเดิม แต่ฉันเปลี่ยนคำอธิบายประกอบ: ฉันระบุชื่ออื่นสำหรับฟิลด์ชื่อ: นามแฝง ฉันยังทำเครื่องหมายฟิลด์น้ำหนักเป็น Ignore ซึ่งทำให้วัตถุ JSON เปลี่ยนไป"

"เป็นเรื่องดีที่คุณสามารถปรับแต่งทุกอย่างได้ ฉันคิดว่าฉันจะพบว่าสิ่งนี้มีประโยชน์อย่างแน่นอน"

"และ deserialization จะเข้าใจวิธีการทำงานกับสิ่งนี้หรือไม่ เมื่อ deserializing จาก JSON เป็นวัตถุ Java ค่าของฟิลด์ alias จะถูกเขียนลงในฟิลด์ชื่อของวัตถุ Cat"

"ใช่ การดีซีเรียลไลเซชันจะทำงานอย่างที่ควรจะเป็น มันฉลาด"

“แล้วจะไม่พอใจอะไรล่ะ”

"ขอบคุณสำหรับบทเรียนที่น่าสนใจนี้ เอลลี"