JSON คืออะไรและคุณใช้งานอย่างไร

เผยแพร่แล้ว: 2022-08-14
รูปภาพของข้อความ "JSON" ที่ซ้อนทับบนหน้าจอคอมพิวเตอร์
Maria Vonotna/Shutterstock.com

JSON (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 ยังคงเป็นคู่แข่งสำหรับแอปพลิเคชันที่ต้องการกำหนดสคีมาข้อมูลและไม่สนใจการใช้คำฟุ่มเฟือย