2012-04-12 42 views
9

tôi hy vọng sẽ giải mã các dữ liệu JSON dưới đây:Giải mã JSON để NSArray hoặc NSDictionary

{ 
    "content": 
    [ 
     { 
      "1":"a", 
      "2":"b", 
      "3":"c", 
      "4":"d", 
      "mark":"yes" 
     } 
    ] 
} 

Không chắc chắn nếu đặt nó trong NSArray hoặc NSDictionary

Chào mừng bất kỳ bình luận

+8

[Bạn đã thử gì?] (Http://mattgemmell.com/2008/12/08/what-have-you-tried/) – vikingosegundo

Trả lời

29

bạn đang sử dụng phiên bản iOS nào? trong iOS 5, bạn có lớp NSJSONSerialization để phân tích cú pháp dữ liệu JSON, nếu bạn cần nhắm mục tiêu iOS cũ hơn hoặc MAC OSX, bạn nên sử dụng lib của bên thứ ba chẳng hạn như SBJSON. Chuỗi được đăng sẽ là một NSDictionary với một mảng với một từ điển. Mảng có thể truy cập bằng cách sử dụng chìa khóa @"content"

Trong mã:

NSString * jsonString = @"blblblblblb"; 
NSStringEncoding encoding; 
NSData * jsonData = [jsonString dataUsingEncoding:encoding]; 
NSError * error=nil; 
NSDictionary * parsedData = [NSJSONSerialization JSONObjectWithData:jsonData options:kNilOptions error:&error]; 

Trong SWIFT 2.0:

let jsonString = "blblblblblb" 
    let encoding = NSUTF8StringEncoding 
    let jsonData = jsonString.dataUsingEncoding(encoding) 
    guard let jData = jsonData else {return} 
    do { 
     let parsedData = try NSJSONSerialization.JSONObjectWithData(jData, options: []) 
    } catch let error { 
     print("json error: \(error)") 
    } 

[UPDATE] Lớp NSJSONSerialization cũng có sẵn cho 10,7 wasn nhận xét của tôi không đúng.

+1

Nó không nói rằng đây là cho iOS ... – hypercrypt

+0

Xin lỗi thẻ là mục tiêu c, bằng cách bạn sử dụng một lớp chỉ có sẵn trên iOS5 ;-) – Andrea

+0

Chính xác, do đó, nó không phải là iOS. 'NSJSONSerialization' cũng có sẵn trong OS X 10.7. – hypercrypt

0

Bạn có thể làm như sau :

NSData *data = ...; //JSON data 
NSError *jsonError = nil; 
[NSJSONSerialization JSONObjectWithData:data options:0 error:&jsonError]; 

Bạn sẽ nhận lại một NSDictionary chứa NSArray chứa một đơn NSDictionary chứa năm đối tượng NSString.

3

Chuỗi cụ thể đó sẽ giải mã thành NSDictionary vì điều ngoài cùng là đối tượng JSON ánh xạ vào NSDictionary cho mọi triển khai JSON mà tôi từng thấy. Nếu bạn muốn xử lý một chuỗi tùy ý, bạn sẽ cần phải kiểm tra những gì bạn nhận lại

NSError *jsonError; 
id parsedThing = [NSJSONSerialization JSONObjectWithData:data options:0 error:&jsonError]; 
if (parsedThing == nil) 
{ 
    // error 
} 
else if ([parsedThing isKindOfClass: [NSArray class]]) 
{ 
    // handle array, parsedThing can be cast as an NSArray safely 
} 
else 
{ 
    // handle dictionary, parsedThing can be cast as an NSDictionary 
    // NB only dictionaries and arrays allowed as long as NSJSONReadingAllowFragments 
    // not specified in the options 
} 
0

stringWithContentsOfFile:encoding: bị phản đối trong iOS<6

cho iOS 6+

NSString *filePath = [[NSBundle mainBundle] pathForResource:@"contents" ofType:@"json"]; 
NSError * error=nil; 
NSString *jsonString = [NSString stringWithContentsOfFile:filePath encoding:nil error:&error]; 
NSData * jsonData = [jsonString dataUsingEncoding:nil]; 
NSArray * parsedData = [NSJSONSerialization JSONObjectWithData:jsonData options:kNilOptions error:&error]; 

contents.json tập tin là trong nhóm của mình .

0

Tôi đã sử dụng API nhận dạng giọng nói của Google và tôi đã nhận được phản hồi json không được phân tích cú pháp trực tiếp trên iOS. Các mẫu kết quả giống như:

Trước tiên, tôi đã cố gắng nói rằng Xin chào 1 2 3 đã được nhận dạng mà không có sự cố. Json trả lời là:

{"result":[]} 

{"result":[{"alternative":[{"transcript":"hello 123","confidence":0.59780568},{"transcript":"hello 1 2 3"}],"final":true}],"result_index":0} 

Hoặc khi nói chuyện quá lâu, tôi nhận được một HTML 404 như dưới đây:

<html><title>Error 400 (Bad Request)!!1</title></html> 

Và khi tôi nói chuyện vô nghia, tôi nhận:

{"result":[]} 

Vì vậy, để phân tích cú pháp tất cả phản hồi như vậy, tôi đã sử dụng mã bên dưới:

NSString *msg = @"Could not synthesize !"; 

    NSString *responseString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; 
    NSLog(@"responseString: %@",responseString); 
    if([responseString containsString:@"transcript"]&&responseString.length>25) 
    { 

     responseString = [responseString stringByReplacingOccurrencesOfString:@"{\"result\":[]}" withString:@""]; 

     NSDictionary *dictionary = [NSJSONSerialization JSONObjectWithData:[responseString dataUsingEncoding:NSUTF8StringEncoding] options:kNilOptions error:nil]; 

     if(dictionary!=nil) 
      if(dictionary.allValues.count>0) 
      { 

       NSArray *array =[dictionary valueForKeyPath:@"result.alternative.transcript"]; 

       if(array) 
       { 
        NSArray *array2 = [array objectAtIndex:0]; 
        if(array2) 
        { 
         NSLog(@"%@",[array2 objectAtIndex:0]); 
         msg = [array2 objectAtIndex:0]; 
        }; 
       } 
      } 
    } 

    UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"Google Response" message:msg delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil]; 
    [alert show]; 

Hy vọng điều này sẽ giúp ai đó.

+0

Trên trước iOS8, dòng 'if ([responseString containsString: @" transcript "] && responseString.length> 25)' nên được thay đổi thành: 'if ([responseString rangeOfString: @ "transcript" tùy chọn: NSCaseInsensitiveSearch] .location! = NSNotFound && responseString.length> 25) ' –

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