JSON คืออะไรและคุณใช้งานอย่างไร
เผยแพร่แล้ว: 2022-08-14JSON (JavaScript Object Notation) เป็นรูปแบบมาตรฐานสำหรับการแสดงข้อมูลที่มีโครงสร้าง แม้ว่า JSON จะเติบโตจากภาษาการเขียนโปรแกรม JavaScript แต่ปัจจุบันเป็นวิธีการแลกเปลี่ยนข้อมูลระหว่างระบบที่แพร่หลาย API สมัยใหม่ส่วนใหญ่ยอมรับคำขอ JSON และออกการตอบกลับ JSON ดังนั้นจึงมีประโยชน์ที่จะมีความรู้เกี่ยวกับรูปแบบและคุณสมบัติของรูปแบบเป็นอย่างดี
ในบทความนี้ เราจะอธิบายว่า JSON คืออะไร มันแสดงประเภทข้อมูลต่างๆ อย่างไร และวิธีที่คุณผลิตและใช้ JSON ในภาษาโปรแกรมยอดนิยม นอกจากนี้ เราจะครอบคลุมข้อจำกัดของ JSON และทางเลือกอื่นๆ ที่เกิดขึ้นด้วย
พื้นฐาน JSON
เดิม JSON ถูกคิดค้นโดย Douglas Crockford ให้เป็นรูปแบบไร้สัญชาติสำหรับการสื่อสารข้อมูลระหว่างเบราว์เซอร์และเซิร์ฟเวอร์ ย้อนกลับไปในช่วงต้นทศวรรษ 2000 เว็บไซต์ต่างๆ เริ่มดึงข้อมูลเพิ่มเติมแบบอะซิงโครนัสจากเซิร์ฟเวอร์ของตน หลังจากการโหลดหน้าแรก เนื่องจากรูปแบบข้อความที่ได้มาจาก JavaScript ทำให้ JSON ดึงข้อมูลและใช้ข้อมูลภายในแอปพลิเคชันเหล่านี้ได้ง่ายขึ้น ในที่สุดข้อกำหนดนี้ก็ได้มาตรฐานเป็น ECMA-404 ในปี 2013
JSON ถูกส่งเป็นสตริงเสมอ สตริงเหล่านี้สามารถถอดรหัสเป็นช่วงของประเภทข้อมูลพื้นฐาน ซึ่งรวมถึงตัวเลข บูลีน อาร์เรย์ และอ็อบเจ็กต์ ซึ่งหมายความว่าสามารถรักษาลำดับชั้นและความสัมพันธ์ของอ็อบเจ็กต์ไว้ได้ในระหว่างการส่ง จากนั้นประกอบกลับที่ปลายทางรับในลักษณะที่เหมาะสมกับสภาพแวดล้อมการเขียนโปรแกรม
ตัวอย่าง JSON พื้นฐาน
นี่คือการแสดง JSON ของโพสต์บล็อก:
{ "รหัส": 1001, "title": "JSON คืออะไร", "ผู้เขียน": { "รหัส": 1, "ชื่อ": "เจมส์ วอล์คเกอร์" }, "แท็ก": ["api", "json", "การเขียนโปรแกรม"], "เผยแพร่": เท็จ "publishedTimestamp": null }
ตัวอย่างนี้แสดงประเภทข้อมูล JSON ทั้งหมด นอกจากนี้ยังแสดงให้เห็นถึงความกระชับของข้อมูลที่จัดรูปแบบ JSON ซึ่งเป็นหนึ่งในคุณลักษณะที่ทำให้น่าสนใจสำหรับการใช้งานใน API นอกจากนี้ JSON ยังอ่านได้ง่ายตามที่เป็นอยู่ ซึ่งแตกต่างจากรูปแบบที่ละเอียดกว่า เช่น XML
ประเภทข้อมูล JSON
ข้อมูลหกประเภทสามารถแสดงโดยกำเนิดใน JSON:
- สตริง – สตริงถูกเขียนระหว่างเครื่องหมายอัญประกาศคู่ อักขระอาจถูกหลบหนีโดยใช้แบ็กสแลช
- ตัวเลข – ตัวเลขจะถูกเขียนเป็นตัวเลขโดยไม่มีเครื่องหมายอัญประกาศ คุณสามารถใส่ส่วนประกอบที่เป็นเศษส่วนเพื่อแสดงถึงการลอยตัว การใช้งานการแยกวิเคราะห์ JSON ส่วนใหญ่จะถือว่าเป็นจำนวนเต็มเมื่อไม่มีจุดทศนิยม
- บูลีน – รองรับค่าตัวอักษร
true
และfalse
- Null – ค่าลิเทอรัล
null
สามารถใช้เพื่อแสดงค่าว่างหรือค่าละเว้น - อาร์เรย์ – อาร์เรย์เป็นรายการอย่างง่ายที่แสดงด้วยวงเล็บเหลี่ยม แต่ละองค์ประกอบในรายการจะถูกคั่นด้วยเครื่องหมายจุลภาค อาร์เรย์สามารถมีรายการจำนวนเท่าใดก็ได้ และสามารถใช้ประเภทข้อมูลที่รองรับได้ทั้งหมด
- วัตถุ – วัตถุถูกสร้างขึ้นโดยวงเล็บปีกกา เป็นคอลเลกชั่นของคู่คีย์-ค่าที่คีย์เป็นสตริง หุ้มด้วยอัญประกาศคู่ แต่ละคีย์มีค่าที่สามารถใช้ชนิดข้อมูลที่มีอยู่ได้ คุณสามารถซ้อนอ็อบเจ็กต์เพื่อสร้างลำดับชั้นแบบเรียงซ้อน เครื่องหมายจุลภาคต้องตามหลังแต่ละค่า ซึ่งหมายถึงจุดสิ้นสุดของคู่คีย์-ค่านั้น
ตัวแยกวิเคราะห์ JSON จะแปลงประเภทข้อมูลเหล่านี้เป็นโครงสร้างที่เหมาะสมกับภาษาของพวกเขาโดยอัตโนมัติ คุณไม่จำเป็นต้องแคสต์ id
เป็นจำนวนเต็มด้วยตนเอง เป็นต้น การแยกวิเคราะห์สตริง JSON ทั้งหมดเพียงพอที่จะแมปค่ากลับไปยังรูปแบบข้อมูลดั้งเดิม
ความหมายและการตรวจสอบ
JSON มีกฎบางอย่างที่ต้องปฏิบัติตามเมื่อคุณเข้ารหัสข้อมูลของคุณ สตริงที่ไม่เป็นไปตามไวยากรณ์จะไม่สามารถแยกวิเคราะห์โดยผู้บริโภค
สิ่งสำคัญอย่างยิ่งคือต้องใส่ใจกับเครื่องหมายคำพูดรอบๆ สตริงและคีย์อ็อบเจ็กต์ คุณต้องตรวจสอบให้แน่ใจว่ามีการใช้เครื่องหมายจุลภาคหลังแต่ละรายการในออบเจ็กต์หรืออาร์เรย์ JSON ไม่ อนุญาตให้ใช้เครื่องหมายจุลภาคต่อท้ายหลังจากรายการสุดท้าย – โดยไม่ได้ตั้งใจรวมถึงรายการใดรายการหนึ่งเป็นสาเหตุทั่วไปของข้อผิดพลาดในการตรวจสอบความถูกต้อง โปรแกรมแก้ไขข้อความส่วนใหญ่จะเน้นย้ำถึงปัญหาทางไวยากรณ์สำหรับคุณ ซึ่งจะช่วยระบุข้อผิดพลาด
แม้จะมีจุดการเดินทางทั่วไปเหล่านี้ JSON เป็นหนึ่งในรูปแบบข้อมูลที่ง่ายที่สุดในการเขียนด้วยมือ คนส่วนใหญ่พบไวยากรณ์ที่รวดเร็วและสะดวกเมื่อพวกเขาคุ้นเคยกับมัน JSON โดยรวมมีแนวโน้มที่จะเกิดข้อผิดพลาดน้อยกว่า XML ซึ่งแท็กเปิดและปิดไม่ตรงกัน การประกาศสคีมาที่ไม่ถูกต้อง และปัญหาการเข้ารหัสอักขระมักทำให้เกิดปัญหา
การกำหนดเนื้อหา JSON
โดยปกตินามสกุล . .json
จะใช้เมื่อบันทึก JSON ลงในไฟล์ เนื้อหา JSON มี application/json
ประเภท MIME ที่เป็นมาตรฐาน แม้ว่าบางครั้ง text/json
จะใช้ด้วยเหตุผลด้านความเข้ากันได้ ทุกวันนี้คุณควรพึ่งพา application/json
สำหรับส่วนหัว Accept
และ Content-Type
HTTP
API ส่วนใหญ่ที่ใช้ JSON จะสรุปทุกอย่างในวัตถุระดับบนสุด:
{ "ผิดพลาด": 1,000 }
ไม่จำเป็น แต่ประเภทตัวอักษรใช้ได้ในฐานะโหนดระดับบนสุดในไฟล์ ดังนั้นตัวอย่างต่อไปนี้จึงเป็น JSON ที่ถูกต้องทั้งหมดเช่นกัน:
1000
จริง
โมฆะ
พวกเขาจะถอดรหัสเป็นสเกลาร์ตามลำดับในภาษาการเขียนโปรแกรมของคุณ
การทำงานกับ JSON
ภาษาโปรแกรมส่วนใหญ่รองรับ JSON ในตัว ต่อไปนี้คือวิธีโต้ตอบกับข้อมูล JSON ในสภาพแวดล้อมที่ได้รับความนิยมบางส่วน
JavaScript
ใน JavaScript JSON.stringify()
และ JSON.parse()
ใช้ในการเข้ารหัสและถอดรหัสสตริง JSON:
โพสต์ const = { id : 1001 , title : "JSON คืออะไร?" , ผู้เขียน : { id : 1 , ชื่อ : "เจมส์ วอล์คเกอร์" } } ; const เข้ารหัส Json = JSON ทำให้แน่น ( โพสต์ ) ; // {"id": 1001, "title": "JSON คืออะไร", ...} คอนโซล บันทึก ( encodedJson ) ; const ถอดรหัสJson = JSON แยกวิเคราะห์ ( เข้ารหัส Json ) ; // เจมส์ วอล์คเกอร์ คอนโซล ล็อก ( decodedJson. ชื่อ ผู้แต่ง ) ;
PHP
ฟังก์ชั่นเทียบเท่าใน PHP คือ json_encode()
และ json_decode()
:
$โพสต์ = [ "id" => 1001 , "title" => "JSON คืออะไร" , "ผู้เขียน" => [ "id" => 1 , "name" => "เจมส์ วอล์คเกอร์" ] ] ; $encodedJson = json_encode ( $โพสต์ ) ; // {"id": 1001, "title": "JSON คืออะไร", ...} echo $encodedJson ; $decodedJson = json_decode ( $ encodedJson จริง ) ; // เจมส์ วอล์คเกอร์ echo $decodedJson [ "ผู้แต่ง" ] [ "ชื่อ" ] ;
Python
Python จัดเตรียม json.dumps()
และ json.loads()
เพื่อทำให้เป็นอนุกรมและดีซีเรียลไลซ์ตามลำดับ:
นำเข้า json โพสต์ = { "ไอดี" : 1001 , "title" : "JSON คืออะไร?" , "ผู้แต่ง" : { "ไอดี" : 1 , "ชื่อ" : "เจมส์ วอล์คเกอร์" } } เข้ารหัสJson = json ทิ้ง ( โพสต์ ) # {"id": 1001, "title": "JSON คืออะไร", ...} พิมพ์ ( เข้ารหัส Json ) ถอดรหัสJson = json โหลด ( เข้ารหัส Json ) #เจมส์วอล์คเกอร์ พิมพ์ ( decodedJson [ "ผู้แต่ง" ] [ "ชื่อ" ] )
ทับทิม
Ruby เสนอ JSON.generate
และ JSON.parse
:
ต้องการ "json" โพสต์ = { "id" => 1001 , "title" => "JSON คืออะไร" , "ผู้เขียน" => { "id" => 1 , "name" => "เจมส์ วอล์คเกอร์" } } เข้ารหัส Json = JSON สร้าง ( โพสต์ ) # {"id": 1001, "title": "JSON คืออะไร", ...} ทำให้ เข้ารหัสJson ถอดรหัสJson = JSON แยกวิเคราะห์ ( เข้ารหัส Json ) #เจมส์วอล์คเกอร์ ถอดรหัส Json [ "ผู้แต่ง" ] [ "ชื่อ" ]
ข้อจำกัด JSON
JSON เป็นรูปแบบน้ำหนักเบาที่เน้นการถ่ายทอดค่าภายในโครงสร้างข้อมูลของคุณ ทำให้แยกวิเคราะห์ได้อย่างรวดเร็วและใช้งานได้ง่าย แต่มีข้อเสียที่อาจทำให้เกิดความคับข้องใจ นี่คือปัญหาที่ใหญ่ที่สุดบางส่วน
ไม่มีความคิดเห็น
ข้อมูล JSON ไม่สามารถรวมความคิดเห็นได้ การไม่มีคำอธิบายประกอบช่วยลดความชัดเจนและบังคับให้คุณวางเอกสารประกอบไว้ที่อื่น ซึ่งอาจทำให้ JSON ไม่เหมาะกับสถานการณ์ต่างๆ เช่น ไฟล์ปรับแต่ง ซึ่งการแก้ไขมีไม่บ่อยนักและวัตถุประสงค์ของฟิลด์อาจไม่ชัดเจน
ไม่มีแบบแผน
JSON ไม่อนุญาตให้คุณกำหนดสคีมาสำหรับข้อมูลของคุณ ไม่มีวิธีบังคับใช้ id
นั้นเป็นฟิลด์จำนวนเต็มที่จำเป็น ตัวอย่างเช่น สิ่งนี้สามารถนำไปสู่โครงสร้างข้อมูลที่มีรูปแบบไม่ถูกต้องโดยไม่ได้ตั้งใจ
ไม่มีการอ้างอิง
ฟิลด์ไม่สามารถอ้างอิงค่าอื่นๆ ในโครงสร้างข้อมูลได้ ซึ่งมักทำให้เกิดการซ้ำซ้อนซึ่งเพิ่มขนาดไฟล์ กลับไปที่ตัวอย่างการโพสต์บล็อกจากก่อนหน้านี้ คุณอาจมีรายการโพสต์ในบล็อกดังนี้:
{ "โพสต์": [ { "รหัส": 1001, "title": "JSON คืออะไร", "ผู้เขียน": { "รหัส": 1, "ชื่อ": "เจมส์ วอล์คเกอร์" } }, { "รหัส": 1002, "title": "SaaS คืออะไร", "ผู้เขียน": { "รหัส": 1, "ชื่อ": "เจมส์ วอล์คเกอร์" } } ] }
โพสต์ทั้งสองมีผู้เขียนคนเดียวกัน แต่ข้อมูลที่เกี่ยวข้องกับวัตถุนั้นจะต้องทำซ้ำ ในโลกอุดมคติ การใช้งานตัวแยกวิเคราะห์ JSON จะสามารถสร้างโครงสร้างที่แสดงด้านบนจากอินพุตที่คล้ายกับต่อไปนี้:
{ "โพสต์": [ { "รหัส": 1001, "title": "JSON คืออะไร", "ผู้เขียน": "{{ .authors.james }}" }, { "รหัส": 1002, "title": "SaaS คืออะไร", "ผู้เขียน": "{{ .authors.james }}" } ], "ผู้เขียน": { "เจมส์": { "รหัส": 1, "ชื่อ": "เจมส์ วอล์คเกอร์" } } }
ปัจจุบันนี้ไม่สามารถทำได้ด้วย JSON มาตรฐาน
ไม่มีประเภทข้อมูลขั้นสูง
ประเภทข้อมูลที่รองรับทั้งหกชนิดละเว้นค่าทั่วไปหลายประเภท JSON ไม่สามารถจัดเก็บวันที่ เวลา หรือตำแหน่งทางภูมิศาสตร์ได้ ดังนั้นคุณต้องตัดสินใจเกี่ยวกับรูปแบบของคุณเองสำหรับข้อมูลนี้
ทำให้เกิดความคลาดเคลื่อนและกรณีขอบที่ไม่สะดวก หากแอปพลิเคชันของคุณจัดการการประทับเวลาเป็นสตริง เช่น 2022-07-01T12:00:00+00:00
แต่ API ภายนอกแสดงเวลาเป็นวินาทีหลังจากยุค Unix – 1657287000
คุณจะต้องจำไว้ว่าเมื่อใดควรใช้ รูปแบบ
ทางเลือก JSON
YAML เป็นทางเลือก JSON ชั้นนำ เป็นซูเปอร์เซ็ตของรูปแบบที่มีการนำเสนอที่มนุษย์อ่านได้ง่ายขึ้น ชนิดข้อมูลที่กำหนดเอง และการสนับสนุนสำหรับการอ้างอิง มีวัตถุประสงค์เพื่อจัดการกับความท้าทายในการใช้งานส่วนใหญ่ที่เกี่ยวข้องกับ JSON
YAML ได้เห็นการยอมรับอย่างกว้างขวางสำหรับไฟล์กำหนดค่าและภายในเครื่องมือ DevOps, IaC และความสามารถในการสังเกต มีการใช้เป็นรูปแบบการแลกเปลี่ยนข้อมูลสำหรับ API น้อยกว่า ความซับซ้อนสัมพัทธ์ของ YAML หมายความว่าผู้มาใหม่เข้าถึงได้น้อยลง ข้อผิดพลาดทางไวยากรณ์เล็กน้อยอาจทำให้เกิดความล้มเหลวในการแยกวิเคราะห์
บัฟเฟอร์โปรโตคอล (protobufs) เป็นคู่แข่งรายใหม่ของ JSON ที่ออกแบบมาเพื่อจัดลำดับข้อมูลที่มีโครงสร้าง Protobufs มีการประกาศประเภทข้อมูล ฟิลด์ที่จำเป็น และการสนับสนุนสำหรับภาษาโปรแกรมหลักส่วนใหญ่ ระบบกำลังได้รับความนิยมเนื่องจากเป็นวิธีที่มีประสิทธิภาพมากขึ้นในการส่งข้อมูลผ่านเครือข่าย
สรุป
JSON เป็นรูปแบบการแสดงข้อมูลแบบข้อความที่สามารถเข้ารหัสข้อมูลได้หกประเภท JSON ได้กลายเป็นส่วนสำคัญของระบบนิเวศการพัฒนาซอฟต์แวร์ รองรับโดยภาษาโปรแกรมหลักๆ ทั้งหมด และกลายเป็นตัวเลือกเริ่มต้นสำหรับ REST API ส่วนใหญ่ที่พัฒนาขึ้นในช่วงสองสามทศวรรษที่ผ่านมา
แม้ว่าความเรียบง่ายของ JSON จะเป็นส่วนหนึ่งของความนิยม แต่ก็ยังมีข้อจำกัดในสิ่งที่คุณสามารถทำได้ด้วยรูปแบบ การขาดการสนับสนุนสคีมา ความคิดเห็น การอ้างอิงอ็อบเจ็กต์ และประเภทข้อมูลที่กำหนดเองหมายความว่าบางแอปพลิเคชันจะพบว่าสิ่งเหล่านี้เติบโตเร็วกว่า JSON ที่เป็นไปได้ ทางเลือกที่อายุน้อยกว่า เช่น YAML และ Protobuf ได้ช่วยจัดการกับความท้าทายเหล่านี้ ในขณะที่ XML ยังคงเป็นคู่แข่งสำหรับแอปพลิเคชันที่ต้องการกำหนดสคีมาข้อมูลและไม่สนใจการใช้คำฟุ่มเฟือย