2012-04-28 57 views
10

Tôi đang làm việc với API thời tiết ngầm để tạo một ứng dụng và tôi đã nhấn một lỗi trong khi phân tích cú pháp khối liên quan đến cảnh báo nghiêm trọng. JSON sử dụng các cặp khóa-giá trị có cặp giá trị khóa phụ - không phải là vấn đề đối với tôi, vì tôi có thể tạo các từ điển tiếp theo trong số đó - nhưng mục nhập cảnh báo nghiêm trọng đã được chứng minh là có vấn đề. Xem dưới đây:Phân tích cú pháp một mảng JSON thành một NSDictionary

"alerts": [ 
    { 
    "type": "WAT", 
    "description": "Flash Flood Watch", 
    "date": "3:13 PM EDT on April 28, 2012", 
    "date_epoch": "1335640380", 
    "expires": "8:00 AM EDT on April 29, 2012", 
    "expires_epoch": "1335700800", 
    "message": "\u000A...Flash Flood Watch in effect through Sunday morning...\u000A\u000AThe National Weather Service in Charleston has issued a\u000A\u000A* Flash Flood Watch for portions of northeast Kentucky... (Note: I trimmed this for length's sake), 
    "phenomena": "FF", 
    "significance": "A" 
    } 
] 

Những "cảnh báo" cặp khác với những người khác tôi đã có thể để phân tích bởi vì nó có này [] khung xung quanh các tiểu giá trị và tôi không chắc chắn làm thế nào để xóa nó để Tôi có thể truy cập vào các giá trị phụ. Trong các ví dụ khác tôi đã có thể phân tích cú pháp, nó chỉ có các dấu ngoặc đơn {} chứ không phải cả dấu ngoặc {} và []. Để tham khảo, các dấu ngoặc đơn luôn hiện diện - ngay cả khi không có cảnh báo thời tiết khắc nghiệt ... trong trường hợp đó, cặp "cảnh báo" trả về ngoặc vuông [] mà không có cặp con nào hiện diện.

Có cách nào tôi có thể xóa dấu ngoặc vuông [] khỏi NSDictionary hay bỏ qua chúng? Lời khuyên nào sẽ được đánh giá cao!


Để tham khảo và khắc phục sự cố giúp đỡ, dưới đây là cách tôi đang phân tích các phần còn lại của tài liệu JSON thành công:

1) Tạo một NSDictionary từ JSON liệu

//Process Weather Call 
NSError* error; 
NSDictionary* json = [NSJSONSerialization JSONObjectWithData:responseData options:kNilOptions error:&error]; 

2) Tạo các từ điển tiếp theo cho các cặp json lồng nhau

NSDictionary *current_observation = [json objectForKey:@"current_observation"]; 

3) Gán các giá trị

NSString* weather; 
weather = [current_observation objectForKey:@"weather"]; 

Vì vậy, kết quả cuối cùng sẽ là chuỗi có nội dung "Một phần mây" hoặc thứ gì đó, cùng với nhiều giá trị thời tiết liên quan mà tôi chưa hiển thị. Các phân tích cú pháp thành công bởi vì chúng chỉ có các dấu ngoặc đơn {} chứ không phải dấu ngoặc [].

Trả lời

19

Dấu ngoặc có nghĩa là dữ liệu Json có trong một mảng. Bạn có thể phân tích nó như sau

NSArray *alertArray = [json objectForKey:@"alerts"]; 

bây giờ bạn nên lặp qua tất cả các cảnh báo và phân tích chúng (trong trường hợp của bạn nó chỉ có 1, nhưng nó có thể được nhiều hơn trong một chuỗi json):

//parse each alert 
for (NSDictionary *alert in alertArray){ 
    NSString* description = [alert objectForKey:@"description"]; 
    //etc... 
} 
+0

Tất nhiên, một mảng!Những dấu ngoặc đó nên cho nó đi ... Tôi nghĩ tôi đã làm việc quá lâu ngày hôm nay. : p Dù sao cũng có ý nghĩa trong bối cảnh cảnh báo - có thể có nhiều cảnh báo tại một thời điểm nhất định, vì vậy sẽ có một số cách để xử lý điều đó trong API. Tôi sẽ dùng thử - cảm ơn sự giúp đỡ của bạn! –

5

Okay , Tôi nhận được nó làm việc - và tôi muốn cung cấp một ví dụ ở đây bởi vì tôi đã phải xây dựng trên lời khuyên @Lefteris đã làm cho nó hoạt động.

Tôi đã phải vượt qua mảng json đầu tiên dưới dạng NSArray, và sau đó tôi chuyển đổi nó thành một NSDictionary với phần tử đầu tiên của mảng. Mọi thứ sau đó hoạt động như @Lefteris được mô tả.

Vì vậy, cuối cùng, đây là những gì tôi đã có:

NSArray *alerts = [json objectForKey:@"alerts"]; 
NSDictionary *alertDict = [[NSDictionary alloc] init]; 

//Check that no alerts exist to prevent crashing 
if([alerts count] < 1) { 
    NSLog(@"No Alerts Here!"); 
    type = nil; 
    ... 
} 
else //Populate fields 
{ 
    alertDict = [alerts objectAtIndex:0]; 
    for (NSDictionary *alert in alertDict) 
    { 
     NSLog(@"Printing alert!"); 
     type = [alertDict objectForKey:@"type"]; 
     ... 
    } 
} 

này đã cho tôi và chạy với một mảng lặp đơn - xảy ra tôi mong đợi Tôi chỉ đơn giản là có thể lặp qua mảng vì tôi biết số lượng và xử lý bất kỳ cảnh báo bổ sung nào. Cảm ơn một lần nữa vì sự giúp đỡ!

+0

Mã này hiện vẫn đang hoạt động, tôi đã thử nó với ví dụ của bạn chính nó – Khay

+0

@Khay Xin lỗi? Làm việc tốt cho tôi vào thời điểm đó. Có vẻ như nghi ngờ với tôi rằng không ai đã chỉ ra một vấn đề với 10k lượt xem và 2 năm trôi qua. Bạn có đang sử dụng cùng một phiên bản iOS và cùng một dữ liệu (hoặc có thể so sánh) được không? Ngoài ra, xem lại lịch sử chỉnh sửa của câu trả lời của Lefteris - mã đã thay đổi ở đó vào năm ngoái, vì vậy có thể một số thứ đã thay đổi rất nhiều với các phiên bản mới hơn. Tôi thực sự không thể nói với bạn vì tôi không làm việc với iOS nữa. –

Các vấn đề liên quan