โครงสร้าง JSON ใดที่จะใช้สำหรับคู่ค่าคีย์


23

รูปแบบ JSON ใดเป็นตัวเลือกที่ดีกว่าสำหรับคู่ของค่าคีย์และทำไม

[{"key1": "value1"}, {"key2": "value2"}]

หรือ:

[{"Name": "key1", "Value": "value1"}, {"Name": "key2", "Value": "value2"}]

หรือ:

{"key1": "value1", "key2": "value2"}

ตัวแปรแรกดูเหมือนกะทัดรัดและ "ความหมายเชิงความหมาย" มากขึ้น ตัวแปรที่สองนั้นมีโครงสร้างที่เท่าเทียมกันมากขึ้นซึ่งอาจช่วยในการประมวลผล ตัวแปรที่ 3 ดูเหมือนจะมีความหมายมากยิ่งขึ้น

คู่ค่าคีย์จะถูกใช้เพื่อแนบข้อมูลโดยพลการกับรายการอื่น ๆ ข้อมูลจะต้องต่อเนื่องกันเป็น JSON เพื่อปัดเศษข้อมูลผ่านระบบ


3
ถ้าคุณจำเป็นต้องมีการสั่งซื้อทำไมไม่พิจารณา{"key1": "value1", "key2": "value2"}?
kennytm

4
JSON เป็นพจนานุกรม (ซ้อนได้) อยู่แล้ว
Kasey Speakman

1
ปัญหาของคุณคือคำอธิบายนั้นกว้างพอที่จะบอกได้ว่ารูปแบบใดจะทำงานได้และคำถามจริงคือวิธีการใช้งานให้ง่ายขึ้นซึ่งขึ้นอยู่กับเทคโนโลยีที่ลูกค้าใช้
scriptin

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

คำตอบ:


10

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

ตัวเลือกที่สองนั้นแย่มากและฉันยังไม่พบเคสที่เหมาะสมสำหรับมัน เหตุผลที่น่ากลัวนอกเหนือจากการใช้ verbose มากขึ้นก็คือสำหรับ JSON ระดับเดียวมันทำให้การแปลงโดยอัตโนมัติของห้องสมุดส่วนใหญ่เป็นพจนานุกรม / แผนที่ สำหรับ JSON ที่ซ้อนกันอย่างลึกซึ้งจะแบ่งอินเทอร์เฟซการค้นหาที่ เหมือนของXPath

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


5
ข้อได้เปรียบที่ยิ่งใหญ่ของตัวเลือกที่สองคือการทำงานกับคีย์ที่ไม่ใช่สตริงโดยเฉพาะอย่างยิ่งคีย์ผสม
CodesInChaos

1
ตัวเลือกที่สองนั้นแย่มากและคุณยังไม่พบเคสที่ใช้? อาเรย์ของพจนานุกรมที่มีคู่คีย์ / ค่าจำนวนมากจะต้องอยู่ในรูปแบบที่พบได้บ่อยที่สุดสำหรับการส่งสัญญาณหลายวัตถุ
gnasher729

2
@ gnasher729 ใน "รูปแบบที่พบมากที่สุดของคุณ" [{"key1": "value1", "key2": "value2"}]กรณีที่ปุ่มจริงทั้งหมดที่อยู่ด้านซ้ายมือ: รูปแบบที่สองที่นี่คือการวางคีย์จริงทางด้านขวาและใช้คีย์อื่นที่ชื่อว่า "ชื่อ" เพื่อนำคุณไปยังคีย์จริงทำให้ยากในการแยกวิเคราะห์ด้วยเครื่องมือมาตรฐาน
Karl Bielefeldt

ฉันจะให้อันนั้นแก่คุณ @CodeInChaos ถึงแม้ว่าที่นั่นจะต้องเป็นกรณีพิเศษมาก ฉันไม่เคยเห็นความต้องการมันในป่า
Karl Bielefeldt

3
ขออภัยนี่เป็นคำตอบที่ไม่ดี ตัวเลือกที่ 2 เป็นทั้งที่ใช้บ่อยและแนะนำ จะช่วยให้ความยืดหยุ่นของคีย์จะช่วยให้การขยาย (มีค่ามากขึ้น / เขตข้อมูลเมตาดาต้า) โดยไม่ทำลายผู้บริโภคและมันสามารถรักษาลำดับองค์ประกอบ นอกจากนี้สาเหตุที่ให้มาก็คือเป็นการหลอกลวง: มันไม่ทำลาย "การแปลงโดยอัตโนมัติ" ใด ๆ (มันแค่เคารพการนำเสนอของผู้เขียนในฐานะอาร์เรย์) และทำงานได้ดีกับอินเทอร์เฟซแบบสอบถามแบบ XPath ข้อเสียเพียงอย่างเดียวคือ verbosity ที่เพิ่มขึ้น
Hejazzman

5

รูปแบบที่ 3 โดยทั่วไปดีที่สุด อย่างไรก็ตามนี่คือตัวอย่างของบางสิ่งที่เหมาะสมสำหรับรูปแบบที่ 1:

[{
  "username": "foo",
  "id": 1
}, {
  "username": "bar",
  "id": 2
}, {
  "username": "baz",
  "id": 3
}]

ที่นี่แต่ละวัตถุหมายถึงสิ่งที่แยกต่างหาก (และแต่ละวัตถุใช้คีย์เดียวกันกับวัตถุอื่นดังนั้นจึงไม่สามารถผสานได้) อย่างไรก็ตามแต่ละวัตถุในรายการจะถูกเก็บไว้{ "username": "foo", "id": 1 }มากกว่า[{ "username": "foo" }, { "id": 1 }]1) มันสั้นกว่าและ 2) มันอ้างถึงสิ่งหนึ่งด้วยชื่อผู้ใช้และรหัสไม่ใช่สิ่งหนึ่งที่มีชื่อผู้ใช้และอีกสิ่งหนึ่งที่มีรหัส

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

{
  "key": "foo",
  "value": 1,
  "mutable": true
}

ที่นี่mutableอ้างถึงกรณีสมมุติว่าคุณสามารถแก้ไขคุณสมบัติเองไม่ใช่วัตถุพาเรนต์ ข้อมูลเมตาเช่นนี้คล้ายกับของ JavaScript Object.definePropertyซึ่งเก็บข้อมูล "กำหนดค่าได้" "นับได้" และ "เขียนได้" เกี่ยวกับคุณสมบัติ


ฉันพยายามใช้รูปแบบแรกสำหรับ JSON บางตัวฉันส่งไปยังจุดสิ้นสุด C # REST และไม่ได้แปลงเป็นวัตถุพจนานุกรม การแปลงเป็นรูปแบบที่ 3 จะล้างข้อมูลนั้น
fizch

5

คุณพูดว่านี่คือคู่ของคีย์ / ค่า ในกรณีดังกล่าวให้ใช้ # 3: พจนานุกรมของคู่คีย์ / ค่า

หากไม่ใช่คู่คีย์ / ค่าอย่าเรียก "คีย์" และ "ค่า" และใช้ # 2 อาร์เรย์ของพจนานุกรมที่มีเนื้อหาตามอำเภอใจ

โครงสร้าง # 1 เป็นเพียงแค่บ้าคลั่งเว้นแต่คุณต้องการคู่คีย์ / ค่า แต่ก็ต้องเรียงตามลำดับ ซึ่งคุณไม่ค่อยทำ


3

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

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