ไม่สามารถเข้าถึงคุณสมบัติ JSON ด้วยเครื่องหมายขีด "-"


128

ฉันไม่สามารถดึงค่าจากวัตถุ json เมื่อสตริงมีอักขระเส้นประ:

{
"profile-id":1234, "user_id":6789
}

ถ้าฉันพยายามอ้างอิงการแยกวิเคราะห์jsonObj.profile-idจะส่งคืนReferenceError: "id" is not definedแต่ jsonObj.user_id จะส่งคืน 6789

ฉันไม่มีวิธีแก้ไขค่าที่ส่งคืนโดยการเรียก API ภายนอกและการพยายามแยกวิเคราะห์สตริงที่ส่งคืนเพื่อลบขีดกลางจะทำลาย URL ฯลฯ ที่ส่งผ่านไปเช่นกัน ช่วยด้วย?


3
อาจช่วยเพิ่มข้อมูลเกี่ยวกับภาษา / ตัวแยกวิเคราะห์ที่คุณพยายามใช้เพื่อแยกวิเคราะห์ JSON
Mike Brant

1
Utilities.jsonParseไม่พูดอะไรมาก
Darin Dimitrov

คำตอบ:


281

jsonObj.profile-idคือนิพจน์การลบ (เช่นjsonObj.profile - id)

ในการเข้าถึงคีย์ที่มีอักขระที่ไม่สามารถปรากฏในตัวระบุให้ใช้วงเล็บ:

jsonObj["profile-id"]

2
ขอบคุณ! สำหรับข้อมูล: ใช้งานกับเชิงมุมได้เช่นกัน: {{jsonObj.attributes ["profile-id"]}}
BastienSander

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

1
ยังใช้ได้กับวัตถุ "สไตล์" JS อีกด้วย! @SLaks ฉันคาดคะเนวิธีการแก้ปัญหานี้โดยใช้วัตถุสไตล์ JavaScript เพื่อตั้งค่าคุณสมบัติ document.getElementById("someId").style["box-shadow"]="2px 2px 2px #616161";ใช้งานได้ดี!
Eric Hepperle - CodeSlayer2010

2
@ EricHepperle-CodeSlayer2010: คุณควรใช้style.boxShadowแทน styleแปลงวัตถุขีดเพื่อ CamelCase
SLaks

หวาน! ขอบคุณ ... ฉันชอบกรณีอูฐวิธีการที่ดีกว่าเพราะพิมพ์ตัวอักษรน้อยลง ตรวจสอบแล้ว !!
Eric Hepperle - CodeSlayer2010

3

นอกเหนือจากคำตอบนี้โปรดทราบว่าใน Node.js หากคุณเข้าถึง JSON ด้วยไวยากรณ์อาร์เรย์[]คีย์ JSON ที่ซ้อนกันทั้งหมดควรเป็นไปตามไวยากรณ์นั้น

นี่เป็นวิธีที่ผิด

json.first.second.third['comment']

และจะให้ข้อผิดพลาด "ไม่ได้กำหนด"

นี่คือวิธีที่ถูกต้อง

json['first']['second']['third']['comment'] 

เหตุใดจึงเป็นปัญหา วิธีกำปั้นดูปกติสมบูรณ์ นี่คือข้อบกพร่องในภาษาหรือไม่?
Nikola Diklic

ถ้าอยากไปด้วยวิธีนี้. พิจารณาใช้ยูทิลิตี้ที่ใช้งานได้เช่นramdajs.com/docs/#path
Amrit Pal Singh

2

สำหรับ ansible และการใช้ยัติภังค์สิ่งนี้ใช้ได้กับฉัน:

    - name: free-ud-ssd-space-in-percent
      debug:
        var: clusterInfo.json.content["free-ud-ssd-space-in-percent"]
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.