2012-10-18 30 views
7

Tuyên bố sau có đúng không, hoặc tôi có thiếu gì đó không?đối tượng được trả về từ NSJSONSerialization có thể thay đổi

Bạn cần phải kiểm tra các đối tượng trở lại của NSJSONSerialization để xem nếu nó là một từ điển hoặc một mảng - bạn có thể có

data = {"name":"joe", "age":"young"} 
// NSJSONSerialization returns a dictionary 

data = {{"name":"joe", "age":"young"}, 
    {"name":"fred", "age":"not so young"}} 
// returns an array 

Mỗi loại có một phương pháp truy cập khác nhau mà phá vỡ nếu sử dụng sai. Ví dụ:

NSMutableArray *jsonObject = [json objectAtIndex:i]; 
// will break if json is a dictionary 

vì vậy bạn phải làm điều gì đó giống như -

id jsonObjects = [NSJSONSerialization JSONObjectWithData:jsonData 
     options:NSJSONReadingMutableContainers error:&error]; 

    if ([jsonObjects isKindOfClass:[NSArray class]]) 
     NSLog(@"yes we got an Array"); // cycle thru the array elements 
    else if ([jsonObjects isKindOfClass:[NSDictionary class]]) 
     NSLog(@"yes we got an dictionary"); // cycle thru the dictionary elements 
    else 
      NSLog(@"neither array nor dictionary!"); 

tôi đã có một cái nhìn tốt thru stack overflow và tài liệu hướng dẫn của Apple và những nơi khác và không thể tìm thấy bất kỳ xác nhận trực tiếp những điều trên .

+0

Bạn không đề cập đến vấn đề đang xảy ra với mã của mình. –

+0

Vấn đề là nếu bạn nhận được một từ điển trở lại và sử dụng một phương pháp mảng để truy cập nó một ngoại lệ được ném. Tôi nghĩ rằng bạn cần phải kiểm tra kiểu đối tượng trả về để sửa lỗi này, nhưng muốn xác nhận rằng đây là cách chính xác để làm điều đó. – user1705452

Trả lời

5

Nếu bạn chỉ yêu cầu nếu điều này là chính xác hay không, có nó là cách an toàn để xử lý jsonObjects. Đó cũng là cách bạn sẽ làm điều đó với API khác trả về id.

+0

ok - cảm ơn cho điều này - có khá một vài câu hỏi về việc sử dụng NSJSONSerialization và không kiểm tra kiểu trả về (hoặc luôn luôn giả sử nó không phải là biến) là/là (đối với tôi anyway) một gotcha tinh tế. Mục đích của bài đăng này là để xác nhận và làm rõ. – user1705452

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