json.net มีวิธีการที่สำคัญ?


140

หากคำตอบของฉันมีคีย์ "ข้อผิดพลาด" ฉันต้องดำเนินการข้อผิดพลาดและแสดงกล่องคำเตือน

มีวิธี "haskey" ใน json.net หรือไม่ ชอบ:

var x= JObject.Parse(string_my);
if(x.HasKey["error_msg"])
    MessageBox.Show("Error!")

1
โปรดดูคำตอบของฉันที่นี่
Ben

ฉันตอบคำถามที่มีปัญหาคล้ายกันที่นี่: stackoverflow.com/a/47204235/1037314
Ben

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

คำตอบ:


240

x["error_msg"]ใช้เพียงแค่ nullถ้าคุณสมบัติไม่อยู่ก็จะส่งกลับ


37
เกิดอะไรขึ้นถ้ามูลค่าของทรัพย์สินคือnullอะไร?
Andreas Furster

67
@AndreasFurster จากนั้นก็จะกลับมาเป็นJValueที่มีValueคือไม่เพียงnull null
svick

1
ถ้าคุณสมบัติอาจจะnullคุณสามารถใช้x["error_msg"] is Objectเพื่อตรวจสอบว่าทรัพย์สินที่ถูกกำหนดไว้ในวัตถุ JSON
stonito

2
@ user3199329 นั่นเป็นเพียงวิธีที่ทำให้เกิดความสับสนในการเขียนจึงไม่มีก็ไม่ได้ตรวจสอบว่าทรัพย์สินที่มีอยู่และมีค่าของx["error_msg"] != null null
svick

9
@ WilliamT.Mallard ใน C # 6 คุณสามารถลดความซับซ้อนว่าด้วยการใช้ผู้ประกอบการที่ดัชนี null myJObject["level1property"]?["level2property"]เงื่อนไข:
svick

98

JObjectใช้งานIDictionary<string, JToken>ดังนั้นคุณสามารถใช้:

IDictionary<string, JToken> dictionary = x;
if (dictionary.ContainsKey("error_msg"))

... TryGetValueหรือคุณสามารถใช้ จะดำเนินการโดยใช้วิธีการทั้งสองใช้อินเตอร์เฟซที่ชัดเจนเพื่อให้คุณไม่สามารถใช้งานได้โดยไม่ต้องแปลงแรกที่จะIDictionary<string, JToken>แม้ว่า


ฉันผอมนี้จะช้าแล้วคำตอบที่ยอมรับ แต่ขอบคุณ
SevenDays

2
@wsevendays ไม่สำคัญกับคุณที่นี่หรือเป็นแค่ microoptimizing (และการคาดเดานั้น) คุณควรใช้สิ่งที่คุณอ่านได้มากขึ้น
svick

ความเร็วของโปรเซสเซอร์ 1GHz ของโทรศัพท์ WP7 ของฉันไม่ค่อยดีนักและฉันต้องใส่ใจเรื่องความเร็ว
SevenDays

1
@wsevendays: ทำไมมันช้ากว่า (หรือเร็วกว่า) กว่าคำตอบที่ยอมรับ?
Jon Skeet

24
@wsevenday: ไม่มันไม่ได้สร้างพจนานุกรม การดำเนินการอยู่แล้วJObject IDictionary<string, JToken>นี่เป็นเพียงการอ้างอิง และไม่คำตอบที่ยอมรับไม่ได้ตรวจสอบว่าคีย์อยู่ในอาร์เรย์หรือไม่ ... ยังคงใช้ตัวสร้างดัชนีปกติอยู่ เพียงเพราะดูเหมือนว่าการเข้าถึงอาร์เรย์ไม่ได้หมายความว่าเป็นการเข้าถึงอาร์เรย์ (การเข้าถึงแถวลำดับไม่สามารถเป็นสตริงได้ตั้งแต่แรก)
Jon Skeet

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