“สวัสดี อามีโก้!”
“สวัสดี เอลลี่!”
"เนื่องจากคุณได้รู้จักกับ JSON แล้ว เรามาพูดถึงเรื่องนี้ให้มากขึ้นกันเถอะ"
"ตกลง ปกติใช้ที่ไหน"
"นี่คือวิธีการทำงาน มีคน (ลูกค้า) ขอข้อมูลจากโปรแกรม Java (เซิร์ฟเวอร์) โปรแกรมสร้างวัตถุ Java และเติมข้อมูลจากฐานข้อมูล จากนั้นจะแปลงให้เป็นรูปแบบที่ผู้ร้องขอ (ลูกค้า ) สามารถเข้าใจ เช่น JSON และส่งกลับ"
"ให้ฉันบอกคุณถึงวิธีการทำงานกับ JSON ใน Java โดยพื้นฐานแล้ว เราต้องทำสองสิ่งเท่านั้น: ทำให้วัตถุ Java เป็นอนุกรมในรูปแบบ JSON และยกเลิกการทำให้วัตถุ Java เป็นอนุกรมจากรูปแบบ JSON"
"กล่าวอีกนัยหนึ่งJSON เป็นมาตรฐานสำหรับการส่งข้อความ/ข้อมูลจากโปรแกรมหนึ่งไปยังอีกโปรแกรมหนึ่งมีมาตรฐานมากมายเช่นนั้น แต่ถ้าโปรแกรมเขียนด้วย JavaScript โปรแกรมมักจะพยายามใช้ JSON"
"ตกลง ฉันพร้อมแล้ว"
"เยี่ยมมาก งั้นเรามาเริ่มกันเลย"
"อย่างที่คุณทราบอยู่แล้วว่า Java มีเครื่องมือการทำให้เป็นอนุกรมมาตรฐานในตัว แต่ไม่รองรับ JSON ดังนั้น หากคุณต้องการทำให้วัตถุเป็นอนุกรมเป็น JSON คุณสามารถใช้เฟรมเวิร์ก (ไลบรารี) ยอดนิยมตัวใดตัวหนึ่งที่รู้วิธี ทำเช่นนี้."
"กรอบการทำงานที่แตกต่างกันเหล่านี้แตกต่างกันอย่างไร"
"พวกเขามักจะแตกต่างกันในระดับความซับซ้อน: มีเฟรมเวิร์กที่ทำได้เฉพาะพื้นฐานเท่านั้น แต่ก็มีขนาดเล็กและเรียบง่ายมาก และมีเฟรมเวิร์กที่ซับซ้อนขนาดใหญ่ที่สามารถทำได้มากกว่านั้น"
"Jackson เป็นหนึ่งในเฟรมเวิร์กที่ได้รับความนิยมมากที่สุด เราจะใช้มันเป็นตัวอย่างเมื่อเราดูวิธีการทำงานกับ JSON"
"ขั้นแรก คุณต้องดาวน์โหลดเฟรมเวิร์กนี้และเพิ่มลงในโปรเจ็กต์ของคุณ คุณต้องทำสิ่งนี้โดยตรงใน IntelliJ IDEA คุณสามารถดาวน์โหลดเฟรมเวิร์กโดยใช้ลิงก์นี้ "
"เสร็จแล้ว."
"เยี่ยมมาก งั้นไปกันต่อเถอะ"
"การแปลงวัตถุ Java เป็น JSON นั้นง่ายพอๆ กับการทำให้เป็นอนุกรม ในการทำเช่นนี้ มีคลาส ObjectMapper พิเศษ (com.fasterxml.jackson.databind.ObjectMapper)"
"ให้ฉันแสดงตัวอย่างการทำงานให้คุณดู จากนั้นเราจะวิเคราะห์:"
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);
}
@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"
"การดีซีเรียลไลเซชันจะมีลักษณะอย่างไร"
"เกือบจะเหมือนกันเพียงแต่สั้นลง:"
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);
}
@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 | วางไว้ก่อนชั้นเรียน ให้คุณระบุลำดับของฟิลด์ในระหว่างการทำให้เป็นอนุกรม |
"น่าสนใจจัง! มีอีกไหม?"
"มีมากมาย แต่เราจะไม่กล่าวถึงตอนนี้ ตอนนี้เรามาปรับปรุงตัวอย่างแรกกันเล็กน้อย:"
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);
}
@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"
"ใช่ การดีซีเรียลไลเซชันจะทำงานอย่างที่ควรจะเป็น มันฉลาด"
“แล้วจะไม่พอใจอะไรล่ะ”
"ขอบคุณสำหรับบทเรียนที่น่าสนใจนี้ เอลลี"
GO TO FULL VERSION