将NSString转换为NSDictionary / JSON

86

我有以下数据保存在一个NSString中:

 {
    Key = ID;
    Value =         {
        Content = 268;
        Type = Text;
    };
},
    {
    Key = ContractTemplateId;
    Value =         {
        Content = 65;
        Type = Text;
    };
},

我想将这个数据转换成一个包含键值对的 NSDictionary

我首先尝试将 NSString 转换为 JSON 对象,如下所示:

 NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding];
id json = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];

然而,当我尝试时:

NSString * test = [json objectForKey:@"ID"];
NSLog(@"TEST IS %@", test);

我收到的值是NULL

有人能提供一下问题所在吗?


1
请注意,在给定的 JSON 字符串中,“ID”是值,而不是键。 - Sunil Zalavadiya
NSLog(@"JSON是%@", json); - Prasad G
5个回答

265

我认为你错误地解释了JSON格式的键值。你应该将你的字符串存储为

NSString *jsonString = @"{\"ID\":{\"Content\":268,\"type\":\"text\"},\"ContractTemplateID\":{\"Content\":65,\"type\":\"text\"}}";
NSData *data = [jsonString dataUsingEncoding:NSUTF8StringEncoding];
id json = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];

现在,如果您执行以下NSLog语句

NSLog(@"%@",[json objectForKey:@"ID"]);

结果将是另一个NSDictionary。

{
    Content = 268;
    type = text;
}

1
这并不是回答问题的方法,因为你告诉那个人重新格式化他们的字符串。在某些情况下(例如iOS6格式IAP收据),你会得到一个以这种格式呈现的字符串。 - Chris Prince
1
您总是可以发布答案,即使对于已接受答案的问题也是如此。因此,请尽快发布您的版本答案并联系 OP 考虑修改已经接受的答案。 :) - Janak Nirmal
1
顺便问一下,OP发布了JSON吗?你确定吗?请检查OP的要求,是否可以在该格式内实现?如果是,请回答问题,我会点赞并创建新的悬赏,并授予给您。 - Janak Nirmal

14

我认为你是从响应中获取数组,所以你需要将响应分配给数组。

NSError *err = nil;
NSArray *array = [NSJSONSerialization JSONObjectWithData:[string dataUsingEncoding:NSUTF8StringEncoding] options:NSJSONReadingMutableContainers error:&err];
NSDictionary *dictionary = [array objectAtIndex:0];
NSString *test = [dictionary objectForKey:@"ID"];
NSLog(@"Test is %@",test);

6

在您的JSON字符串为str时,请使用以下代码:

NSError *err = nil;
NSArray *arr = 
 [NSJSONSerialization JSONObjectWithData:[str dataUsingEncoding:NSUTF8StringEncoding] 
                                 options:NSJSONReadingMutableContainers 
                                   error:&err];
// access the dictionaries
NSMutableDictionary *dict = arr[0];
for (NSMutableDictionary *dictionary in arr) {
  // do something using dictionary
}

[arr count] 返回了零。 - GuybrushThreepwood
错误是Error Domain=NSCocoaErrorDomain Code=3840,“操作无法完成。(Cocoa错误3840。)”(JSON文本未以数组或对象开头,并且未设置允许片段选项。)UserInfo=0x1f5b3660 {NSDebugDescription=JSON文本未以数组或对象开头,并且未设置允许片段选项。} - GuybrushThreepwood
您的 JSON 数据存在格式错误。 - Woodstock

2

Swift 3:

if let jsonString = styleDictionary as? String {
    let objectData = jsonString.data(using: String.Encoding.utf8)
    do {
        let json = try JSONSerialization.jsonObject(with: objectData!, options: JSONSerialization.ReadingOptions.mutableContainers) 
        print(String(describing: json)) 

    } catch {
        // Handle error
        print(error)
    }
}

0
使用以下代码从AFHTTPSessionManager失败块中获取响应对象;然后您可以将通用类型转换为所需的数据类型:
id responseObject = [NSJSONSerialization JSONObjectWithData:(NSData *)error.userInfo[AFNetworkingOperationFailingURLResponseDataErrorKey] options:0 error:nil];

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接