Decode JSON to NSArray or NSDictionary

前端 未结 5 1625
野的像风
野的像风 2020-11-29 09:51

I hope to decode the JSON data below:

{
    \"content\":
    [   
        {
            \"1\":\"a\",
            \"2\":\"b\",
            \"3\":\"c\",
               


        
相关标签:
5条回答
  • 2020-11-29 10:06

    which iOS version are you using? in iOS 5 you have the NSJSONSerialization class to parse JSON data, if you need to target older iOSs or MAC OSX you should use third parties lib such as SBJSON. The string posted will be a NSDictionary with an array with one dictionary. The array will be accessible using the key @"content"

    In code:

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

    In 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] The NSJSONSerialization class is also available for 10.7 my comment wasn't correct.

    0 讨论(0)
  • 2020-11-29 10:07

    You can do the following:

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

    You will get back an NSDictionary containing an NSArray containing a single NSDictionary containing five NSString objects.

    0 讨论(0)
  • 2020-11-29 10:13

    stringWithContentsOfFile:encoding: is deprecated in iOS<6

    for 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 file is in your bundle.

    0 讨论(0)
  • 2020-11-29 10:21

    I used google speech recognition API and I was getting a json response which was not directly parsable on iOS. Results samples were like :

    First I tried saying Hello 1 2 3 which was recognised without issues. Json response was :

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

    Or when talked for too long, I got a 404 HTML like below :

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

    And when I spoke gibberish , I got :

    {"result":[]}
    

    So to parse all such response, I used the below code :

     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];
    

    Hope this helps someone.

    0 讨论(0)
  • 2020-11-29 10:23

    That particular string will decode into an NSDictionary because the outermost thing is a JSON object which maps onto a NSDictionary for every JSON implementation I have ever seen. If you want to process an arbitrary string, you'll need to test what you get back

    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 讨论(0)
提交回复
热议问题