如何将 NSArray(字符串格式)转换为真正的数组格式?

How to convert NSArray ( in string format) to real Array format?

当我解析一个 JSON 时,我在我的 NSArray

中得到了以下结果
(
    {
    category = Allergies;
    group = Allergies;
    name = "Food Allergies";
    option = "";
    subGroup = "";
    type = VARCHAR;
},
    {
    category = Allergies;
    group = Allergies;
    name = "Drug Allergies";
    option = "";
    subGroup = "";
    type = VARCHAR;
},
    {
    category = Allergies;
    group = "";
    name = "Blood Group";
    option = "[{\"id\":1,\"isDefault\":false,\"additionalOption\":false,\"optionName\":\"A+\"},{\"id\":2,\"isDefault\":false,\"additionalOption\":false,\"optionName\":\"A-\"},{\"id\":3,\"isDefault\":false,\"additionalOption\":false,\"optionName\":\"B+\"},{\"id\":4,\"isDefault\":false,\"additionalOption\":false,\"optionName\":\"B-\"},{\"id\":5,\"isDefault\":false,\"additionalOption\":false,\"optionName\":\"O+\"},{\"id\":6,\"isDefault\":false,\"additionalOption\":false,\"optionName\":\"O-\"},{\"id\":7,\"isDefault\":false,\"additionalOption\":false,\"optionName\":\"AB+\"},{\"id\":8,\"isDefault\":false,\"additionalOption\":false,\"optionName\":\"AB-\"}]";
    subGroup = "";
    type = SINGLESELECT;
}
)

现在,当我尝试获取键的值时 "option"
[array valueForKey:@"option"]objectAtIndex:indexPath.row];

我得到了以下结果

 [{"id":1,"isDefault":false,"additionalOption":false,"optionName":"A+"},{"id":2,"isDefault":false,"additionalOption":false,"optionName":"A-"},{"id":3,"isDefault":false,"additionalOption":false,"optionName":"B+"},{"id":4,"isDefault":false,"additionalOption":false,"optionName":"B-"},{"id":5,"isDefault":false,"additionalOption":false,"optionName":"O+"},{"id":6,"isDefault":false,"additionalOption":false,"optionName":"O-"},{"id":7,"isDefault":false,"additionalOption":false,"optionName":"AB+"},{"id":8,"isDefault":false,"additionalOption":false,"optionName":"AB-"}]

但是当尝试访问 "optionName" 时,格式如下

[optionArray valueForKey:@"optionName"]; 然后我得到了这个错误

 *** Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<__NSCFConstantString 0x10d8638a0> valueForUndefinedKey:]: this class is not key value coding-compliant for the key optionName.'

请帮我解决这个问题..

使用这个方法

- (NSArray *)convertStringToDictionary:(NSString *)str{
    NSError *jsonError;
    NSData *objectData = [str dataUsingEncoding:NSUTF8StringEncoding];
    NSArray *json = [NSJSONSerialization JSONObjectWithData:objectData                                               options:NSJSONReadingMutableContainers error:&jsonError];

    return json;
}

然后这样调用

NSArray *arr =  [self convertStringToDictionary:@"[{\"id\":1,\"isDefault\":false,\"additionalOption\":false,\"optionName\":\"A+\"},{\"id\":2,\"isDefault\":false,\"additionalOption\":false,\"optionName\":\"A-\"},{\"id\":3,\"isDefault\":false,\"additionalOption\":false,\"optionName\":\"B+\"},{\"id\":4,\"isDefault\":false,\"additionalOption\":false,\"optionName\":\"B-\"},{\"id\":5,\"isDefault\":false,\"additionalOption\":false,\"optionName\":\"O+\"},{\"id\":6,\"isDefault\":false,\"additionalOption\":false,\"optionName\":\"O-\"},{\"id\":7,\"isDefault\":false,\"additionalOption\":false,\"optionName\":\"AB+\"},{\"id\":8,\"isDefault\":false,\"additionalOption\":false,\"optionName\":\"AB-\"}]"];

NSLog(@"Option Name ---->  %@",[[arr objectAtIndex:0] valueForKey:@"optionName"]);

输出

选项名称----> A+

假设您使用的是 ios 5 或更高版本,JSON 序列化是内置的:

NSArray *json = [NSJSONSerialization 
        JSONObjectWithData:[string dataUsingEncoding:NSUTF8StringEncoding]
        options:kNilOptions 
        error:&error];

在 ios5 之前,您可以使用 SBJSON 来达到同样的目的:

NSArray *jsonObjects = [jsonParser objectWithString:string error:&error];

尝试使用下面的 got 转换为数组

 NSArray *tmpDayArray=[[NSArray alloc]init];
 NSError *error;
 NSData *dictData = [NSJSONSerialization dataWithJSONObject:tmpDayArray options:NSJSONWritingPrettyPrinted error:&error];
 NSString *open_days = [[NSString alloc] initWithData:dictData encoding:NSUTF8StringEncoding];

尝试使用下面的代码将其转换为 NSArray

    NSArray * array =[NSJSONSerialization JSONObjectWithData:[[NSString stringWithFormat:@"%@",@"YOUR STRING"] dataUsingEncoding:NSUTF8StringEncoding]options: NSJSONReadingMutableContainers error:nil];

你有一个复杂的"object graph."它看起来你的外部对象是一个数组,而里面你有字典。

如果 optionArray 是一个 NSArray,那么如果您尝试将其视为字典,它会准确地给出您所报告的错误。

您的代码:

[array valueForKey:@"option"]objectAtIndex:indexPath.row];

正在这样做(虽然你使用的是 KVC,但你应该直接使用数组和字典方法。)

您的代码应该如下所示:

NSDictionary* aDict = array[indexPath.row];
NSString *optionString = aDict[@"option];

不使用像 SBJson 这样的第三方

NSString *optionString  = [[array valueForKey:@"option"]objectAtIndex:indexPath.row];

实际上你得到的 optionString 作为 json 字符串所以你必须解析它然后像这样使用

NSData *data = [optionString dataUsingEncoding:NSUTF8StringEncoding];

NSArray * optionArray = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];

NSLog(@"%@",[optionArray valueForKey:@"optionName"]);