จะแสดงชุดใน JSON อย่างไร


16

JSON สนับสนุนโครงสร้างข้อมูลต่อไปนี้ (เทียบเท่า Java): Scalar, Array / List และ Map

A Setไม่รองรับ out-of-the-box ใน JSON

ฉันคิดหลายวิธีในการเป็นตัวแทนของชุดใน JSON:

[1] - เป็นรายการ

อย่างไรก็ตามรายการมีลำดับของตัวเองดังนั้นสองรายการต่อไปนี้["a", "b"]และ["b", "a"]ไม่เท่ากับรายการ แต่พวกเขาควรจะเท่ากับชุด

[2] - เป็นแผนที่

ใช้ชุดคีย์ของแผนที่และละเว้นค่า

แต่อีกครั้งโดยใช้การเปรียบเทียบแบบมาตรฐานทั้งสองแบบไม่เหมือนกับแผนที่:

{"a": "foo", "b": "bar"}, {"a": null, "b": null}

[3] - เป็นแผนที่ที่มีค่าพิเศษ

ใช้สเกลาร์พูด0หรือnullบังคับให้มันเป็นค่าของทุกคีย์ในแผนที่:

{"a": 0, "b": 0}

ด้วยวิธีนี้ภายใต้เครื่องมือเปรียบเทียบมาตรฐานวัตถุจะเท่ากันแม้ว่าจะเปลี่ยนการเรียงลำดับคีย์

อย่างไรก็ตามเทคนิคนี้สร้างมลภาวะเอกสาร JSON ด้วยข้อมูลที่ไม่เกี่ยวข้อง

[4] - เป็นรายการสั่งซื้อ

กลับไปที่คำแนะนำแรก แต่คราวนี้เป็นรายการสั่งซื้อ ประเภทนี้แก้ปัญหาการเปรียบเทียบ

อย่างไรก็ตามเราควรคำนึงถึงความซับซ้อนของการเรียงลำดับและเครื่องหมายของแผนที่จะจัดการรายการที่ซ้ำกันในขณะที่รายการที่เรียงลำดับไม่ได้ ตัวอย่าง:

{"a": 400, "a": 9}มีการจัดการเป็น{"a": 9}แต่มักจะเป็น["g", "g"]["g", "g"]

ต้องบอกว่าทั้งหมดนั้นดูเหมือนว่ารายการของสัญกรณ์นั้นชัดเจน แต่สัญลักษณ์ของแผนที่นั้นแข็งแกร่งกว่าการทำสำเนาคีย์และทำให้ยากขึ้นที่จะสอดคล้องกับค่าพิเศษ (แม้ว่าจะnullดูเหมือนเป็นตัวเลือกที่ดีสำหรับเรื่องนั้น)

คุณคิดอย่างไร? คุณจะแสดงชุดของ JSON อย่างไร

PS

โปรดทราบว่าคำถามนี้เป็นเพียงเกี่ยวกับ JSON ฉันรู้ว่ามีรูปแบบอื่น ๆ เช่น yaml ยังคง ...


1
JSON ไม่รองรับชุด แต่อยู่นอกขอบเขต มีชุดหรือคอลเลกชันที่แตกต่างไม่ซ้ำใครอยู่ในขอบเขตของแอปพลิเคชัน เพราะมันเป็นคอลเลกชันมันจะชัดเจนมากขึ้นในการใช้ไวยากรณ์คอลเลกชัน
Zymus

1
ทำไมคุณต้องการแสดงชุดใน JSON จำ JSON เป็นรูปแบบการแลกเปลี่ยน
Andres F.

@AndresF ฉันคิดว่ามันเป็นความคิดที่ดีที่จะแสดงคุณลักษณะที่เป็นเอกลักษณ์ของค่า ฉันจะไม่ผูก JSON กับรูปแบบการแลกเปลี่ยน นอกจากนี้ยังมีประโยชน์สำหรับการจัดเก็บเอกสาร (เช่นใน MongoDB)
Ron Klein

@ RonKlein ยุติธรรมเพียงพอ แต่อืม ... อย่าให้ฉันเริ่มต้นด้วย MongoDB: P
Andres F.

ใน YAML ชุดจะแสดงเป็นตัวเลือกของคุณ [3] แต่มีสัญลักษณ์พิเศษที่ JSON ไม่มี
Jasmijn

คำตอบ:


21

คุณทำไม่ได้ ดังที่คุณกล่าวคุณสามารถเป็นตัวแทนอาร์เรย์และพจนานุกรม คุณมีสองทางเลือก

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

แสดงชุดเป็นพจนานุกรมโดยมีค่าตามความชอบต่อคีย์เช่น 0 หรือ null หากคุณไม่สนใจค่านี่เป็นคู่ที่สมบูรณ์แบบ ในทางกลับกันคุณอาจไม่ได้รับการสนับสนุนห้องสมุดสำหรับการแยกคีย์ของพจนานุกรมเป็นชุดหรือสำหรับการเปลี่ยนชุดเป็นพจนานุกรม

ในสภาพแวดล้อมการเขียนโปรแกรมของฉันการแปลงระหว่าง set และ array นั้นง่ายกว่า (array to set จะสูญเสียค่าที่ซ้ำกันซึ่งไม่ควรมีหรือพิจารณาว่าถูกต้อง) ดังนั้นด้วยเหตุผลนั้น แต่นั่นเป็นเรื่องของความคิดเห็น

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


5
กรณีขอบของไม่ใช่สตริงเป็นอาร์กิวเมนต์ที่ดีกับพจนานุกรม
Ron Klein

4

อย่าพยายามแสดงชุดใน JSON ทำเมื่อแยกวิเคราะห์ข้อมูลแทน

ข้อมูล JSON ของคุณควรมีสคีมาซึ่งระบุว่าควรใช้ฟิลด์ใดเป็นชุดข้อมูลหรือคุณอาจมีเมทาดาทาที่ฝังอยู่ในข้อมูล JSON ซึ่งอธิบายว่าเมื่อใดที่รายการควรถูกจัดเป็นชุด (เช่น{"houses": {"_type": "set", "value": [...]}}) หรือแบบแผนการตั้งชื่อ

โปรดทราบว่าตามมาตรฐาน JSON วัตถุ JSON สามารถมีคีย์ที่ซ้ำกัน คำศัพท์ ECMA-404:

วัตถุ

[... ] ไวยากรณ์ JSON ไม่ได้กำหนดข้อ จำกัด ใด ๆ ในสตริงที่ใช้เป็นชื่อไม่ต้องการให้สตริงชื่อนั้นไม่ซ้ำกันและไม่ได้กำหนดนัยสำคัญใด ๆ ให้กับการเรียงลำดับของคู่ชื่อ / ค่า สิ่งเหล่านี้คือข้อควรพิจารณาเชิงความหมายทั้งหมดที่อาจกำหนดโดยตัวประมวลผล JSON หรือในข้อกำหนดที่กำหนดการใช้งานเฉพาะของ JSON สำหรับการแลกเปลี่ยนข้อมูล

AFAICD ไม่มีอะไรใน spec ห้ามใช้ชื่อที่ไม่ซ้ำกันและมีการใช้งานตัวแยกวิเคราะห์ JSON จำนวนมากที่สามารถแยกวิเคราะห์ชื่อวัตถุที่ไม่ซ้ำกัน RFC 7159 ไม่สนับสนุนชื่อที่ไม่ซ้ำสำหรับความสามารถในการทำงานร่วมกัน แต่ไม่ได้ห้ามอย่างใดอย่างหนึ่งอย่างเฉพาะเจาะจงและจะแสดงรายการว่าตัวแยกวิเคราะห์หลายตัวถูกจัดการกับชื่อวัตถุที่ไม่ซ้ำกันอย่างไร

และ ECMA 404 ก็ไม่จำเป็นต้องรักษาลำดับของอาร์เรย์ไว้เช่นกัน:

อาร์เรย์

ไวยากรณ์ JSON ไม่ได้กำหนดความหมายเฉพาะใด ๆ กับการเรียงลำดับของค่า อย่างไรก็ตามโครงสร้างอาร์เรย์ JSON มักจะใช้ในสถานการณ์ที่มีความหมายบางอย่างในการสั่งซื้อ

ถ้อยคำนี้อนุญาตให้แอปพลิเคชันใช้อาร์เรย์เพื่อแสดงชุดหากพวกเขาเลือก

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.