“สวัสดี อามีโก้!”
“สวัสดี เอลลี่!”
"เนื่องจากคุณได้รู้จักกับ 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"
"ใช่ การดีซีเรียลไลเซชันจะทำงานอย่างที่ควรจะเป็น มันฉลาด"
“แล้วจะไม่พอใจอะไรล่ะ”
"ขอบคุณสำหรับบทเรียนที่น่าสนใจนี้ เอลลี"