将JSON解码为NSArray或NSDictionary

时间:2012-04-12 10:20:49

标签: objective-c json

我希望解码下面的JSON数据:

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

不确定是否将其放入NSArray或NSDictionary

欢迎任何评论

5 个答案:

答案 0 :(得分:31)

你正在使用哪个iOS版本?在iOS 5中,您有NSJSONSerialization类来解析JSON数据,如果您需要定位较旧的iOS或MAC OSX,则应使用第三方库,例如SBJSON。发布的字符串将是一个带有一个字典的数组的NSDictionary。可以使用键@"content"

访问该数组

在代码中:

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

在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] NSJSONSerialization课程也适用于10.7我的评论不正确。

答案 1 :(得分:3)

该特定字符串将解码为NSDictionary,因为最外层的东西是一个JSON对象,它映射到我所见过的每个JSON实现的NSDictionary。如果你想处理任意字符串,你需要测试你得到的东西

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
}

答案 2 :(得分:1)

stringWithContentsOfFile:encoding:已弃用iOS<6

代表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文件在你的包中。

答案 3 :(得分:0)

您可以执行以下操作:

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

您将收到一个NSDictionary,其中包含NSArrayNSDictionary,其中包含五个NSString个{{1}}个对象。

答案 4 :(得分:0)

我使用谷歌语音识别API,我得到了一个json响应,这在iOS上无法直接解析。结果样本如:

首先,我尝试说Hello 1 2 3,但没有问题。 Json的回应是:

{"result":[]}

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

或者,当谈了太久时,我得到了一个404 HTML,如下所示:

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

当我说喋喋不休时,我得到了:

{"result":[]}

因此,为了解析所有这样的响应,我使用了以下代码:

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

希望这有助于某人。