json.net có phương pháp chính?


139

Nếu phản hồi của tôi có "lỗi" khóa, tôi cần xử lý lỗi và hiển thị hộp cảnh báo.

Có phương pháp "haskey" tồn tại trong json.net không? Giống:

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

1
Vui lòng tham khảo câu trả lời của tôi ở đây .
Ben

Tôi đã trả lời một câu hỏi với vấn đề tương tự ở đây: stackoverflow.com/a/47204235/1037314
Ben

1
Có hai biến thể của câu hỏi này: Một biến thể là trong đó từ điển JSON là phẳng (không có trẻ em) và một biến thể khác, trong đó khóa nằm ở đâu đó trong hệ thống phân cấp của trẻ em. Tại thời điểm viết bài này, ns.json vẫn không có phương thức tiện lợi nào cho phép truy cập dễ dàng để kiểm tra khóa.
ljgww

Câu trả lời:


239

Chỉ cần sử dụng x["error_msg"]. Nếu tài sản không tồn tại, nó sẽ trả lại null.


37
Nếu giá trị của tài sản là nullgì?
Andreas Furster 04/03/2015

67
@AndreasFurster Sau đó, nó sẽ trả về một JValueValuenull, không chỉ null.
Svick 4/03/2015

1
Nếu thuộc tính có thể là nullbạn có thể sử dụng x["error_msg"] is Objectđể kiểm tra xem thuộc tính có được xác định trong đối tượng JSON không
stonito

2
@ user3199329 Đó chỉ là một cách viết khó hiểu x["error_msg"] != null, vì vậy không, nó không kiểm tra xem tài sản có tồn tại và có giá trị hay không null.
Svick

9
@ WilliamT.Mallard Trong C # 6, bạn có thể đơn giản hóa điều đó bằng cách sử dụng toán tử chỉ mục có điều kiện null : myJObject["level1property"]?["level2property"].
Svick

98

JObjectthực hiện IDictionary<string, JToken>, vì vậy bạn có thể sử dụng:

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

... Hoặc bạn có thể sử dụng TryGetValue. Nó thực hiện cả hai phương pháp bằng cách sử dụng giao diện rõ ràng, vì vậy bạn không thể sử dụng chúng mà không cần chuyển đổi trước IDictionary<string, JToken>.


Tôi gầy này sẽ từ từ sau đó là câu trả lời được chấp nhận, nhưng cảm ơn.
Bảy

2
@wsevendays, tốc độ có quan trọng với bạn ở đây không hay chỉ là vi mô hóa (và dựa trên dự đoán)? Bạn nên sử dụng những gì bạn thấy dễ đọc hơn.
Svick

Tốc độ bộ xử lý 1GHz của điện thoại WP7 của tôi không lớn và tôi cần quan tâm đến tốc độ.
Bảy

1
@wsevendays: Tại sao nó sẽ chậm hơn (hoặc nhanh hơn) so với câu trả lời được chấp nhận?
Jon Skeet

24
@wsevenday: Không, nó không tạo từ điển. JObject đã thực hiện IDictionary<string, JToken> . Đây chỉ là một bài tập tham khảo. Và không, câu trả lời được chấp nhận không kiểm tra xem khóa có nằm trong một mảng không ... nó vẫn đang sử dụng một bộ chỉ mục bình thường. Chỉ vì có vẻ như truy cập mảng không có nghĩa truy cập mảng. (Truy cập mảng không thể bằng một chuỗi ở vị trí đầu tiên.)
Jon Skeet

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.