12

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

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

不确定是放在 NSArray 还是 NSDictionary

欢迎任何评论

4

5 回答 5

33

您使用的是哪个 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)")
    }

[更新] 该NSJSONSerialization课程也可用于 10.7 我的评论不正确。

于 2012-04-12T10:25:31.490 回答
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
}
于 2012-04-12T10:42:22.780 回答
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文件在您的捆绑包中。

于 2013-09-10T09:57:18.237 回答
0

您可以执行以下操作:

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

您将返回一个NSDictionary包含一个包含五个对象NSArray的单个对象。NSDictionaryNSString

于 2012-04-12T10:25:21.833 回答
0

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

首先,我尝试说 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];

希望这可以帮助某人。

于 2014-12-17T11:02:15.050 回答