2013-05-28 10 views
23

Tôi có một khối json như thế này:truy cập vào tất cả các mục trong JTOKEN, Json.NET

{ 
    "ADDRESS_MAP":{ 

     "ADDRESS_LOCATION":{ 
      "type":"separator", 
      "name":"Address", 
      "value":"", 
      "FieldID":40 
     }, 
     "LOCATION":{ 
      "type":"locations", 
      "name":"Location", 
      "keyword":{ 
       "1":"LOCATION1" 
      }, 
      "value":{ 
       "1":"United States" 
      }, 
      "FieldID":41 
     }, 
     "FLOOR_NUMBER":{ 
      "type":"number", 
      "name":"Floor Number", 
      "value":"0", 
      "FieldID":55 
     }, 
     "self":{ 
      "id":"2", 
      "name":"Address Map" 
     } 
    } 
} 

Làm thế nào tôi có thể nhận được tất cả các mục quan trọng mà thẻ này bao gồm. Ví dụ từ mã ở trên, tôi muốn có "ADRESS_LOCATION", "LOCATION", "FLOOR_NUMBER" và "self".

Cảm ơn

Trả lời

39

Bạn có thể đúc của bạn JToken đến một JObject và sau đó sử dụng phương pháp Properties() để có được một danh sách các thuộc tính đối tượng. Từ đó, bạn có thể lấy tên khá dễ dàng.

Something như thế này:

string json = 
@"{ 
    ""ADDRESS_MAP"":{ 

     ""ADDRESS_LOCATION"":{ 
      ""type"":""separator"", 
      ""name"":""Address"", 
      ""value"":"""", 
      ""FieldID"":40 
     }, 
     ""LOCATION"":{ 
      ""type"":""locations"", 
      ""name"":""Location"", 
      ""keyword"":{ 
       ""1"":""LOCATION1"" 
      }, 
      ""value"":{ 
       ""1"":""United States"" 
      }, 
      ""FieldID"":41 
     }, 
     ""FLOOR_NUMBER"":{ 
      ""type"":""number"", 
      ""name"":""Floor Number"", 
      ""value"":""0"", 
      ""FieldID"":55 
     }, 
     ""self"":{ 
      ""id"":""2"", 
      ""name"":""Address Map"" 
     } 
    } 
}"; 

JToken outer = JToken.Parse(json); 
JObject inner = outer["ADDRESS_MAP"].Value<JObject>(); 

List<string> keys = inner.Properties().Select(p => p.Name).ToList(); 

foreach (string k in keys) 
{ 
    Console.WriteLine(k); 
} 

Output:

ADDRESS_LOCATION 
LOCATION 
FLOOR_NUMBER 
self 
+0

iterating trên các container JObject thay vì chuyển sang loại kết quả NET trong mã ít hơn và hiệu suất có lẽ tốt hơn. Tôi đã thêm một câu trả lời để bổ sung câu trả lời này cho thấy cách tiếp cận đó. – Ian

0

Nếu bạn biết cấu trúc của json rằng bạn đang nhận được sau đó tôi khuyên bạn nên có một cấu trúc lớp phản ánh những gì bạn nhận được trong json.

Sau đó, bạn có thể gọi một cái gì đó của nó như thế này ...

AddressMap addressMap = JsonConvert.DeserializeObject<AddressMap>(json); 

(Trong trường hợp json là một chuỗi chứa json trong câu hỏi)

Nếu bạn không biết định dạng của json bạn đã nhận được sau đó nó được một chút phức tạp hơn và bạn có thể cần phải phân tích cú pháp nó theo cách thủ công.

séc ra http://www.hanselman.com/blog/NuGetPackageOfTheWeek4DeserializingJSONWithJsonNET.aspx để biết thêm

13

Ngoài việc trả lời chấp nhận Tôi muốn đưa ra một câu trả lời cho thấy làm thế nào để lặp trực tiếp trên các bộ sưu tập Newtonsoft. Nó sử dụng ít mã hơn và tôi đoán nó hiệu quả hơn vì nó không liên quan đến việc chuyển đổi các bộ sưu tập.

using Newtonsoft.Json; 
using Newtonsoft.Json.Linq; 
//Parse the data 
JObject my_obj = JsonConvert.DeserializeObject<JObject>(your_json); 

foreach (KeyValuePair<string, JToken> sub_obj in (JObject)my_obj["ADDRESS_MAP"]) 
{ 
    Console.WriteLine(sub_obj.Key); 
} 

tôi bắt đầu làm điều này bản thân mình vì JsonConvert tự động deserializes đối tượng lồng nhau như JToken (mà là JObject, JValue, hoặc JArray bên dưới tôi nghĩ).

Tôi nghĩ rằng các công trình phân tích cú pháp theo các nguyên tắc sau:

  • Mỗi đối tượng là trừu tượng như một Cast JToken

  • để JObject mà bạn mong đợi một điển

  • Cast để JValue nếu JToken đại diện cho một nút đầu cuối và là một giá trị

  • Truyền tới JArray nếu của nó một mảng

  • JValue.Value cung cấp cho bạn các loại NET bạn cần

+0

Giải thích rất hữu ích về nguyên tắc phân tích cú pháp điểm, cảm ơn. – stuzor