将NSString转换为NSDictionary / JSON


83

我将以下数据另存为NSString

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

我想将此数据转换为NSDictionary包含键值对的。

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

 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 2013年

NSLog(@“ JSON IS%@”,json); ??????
Prasad G

Answers:


258

我相信您误解了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收据),系统会为您提供此格式的字符串。
克里斯·普林斯

1
您甚至可以随时发布答案,甚至可以回答已接受答案的问题。因此,请赶快发布您的答案版本,并使用OP来考虑修改已接受的答案。:)
Janak Nirmal 2014年

1
BTW OP已发布JSON?你确定吗?请检查OP的要求,是否可以在该格式下实现?如果是,请回答问题,我将投票并创造新的悬赏并将其奖励给您。
Janak Nirmal 2014年

14

我认为您是从响应获取数组的,因此您必须将响应分配给数组。

NSError * err = nil;
NSArray * array = [NSJSONSerialization JSONObjectWithData:[字符串dataUsingEncoding:NSUTF8StringEncoding]选项:NSJSONReadingMutableContainers错误:&err];
NSDictionary * dictionary = [array objectAtIndex:0]; 
NSString * test = [dictionary objectForKey:@“ ID”];
NSLog(@“ Test is%@”,test);

6

使用以下代码,其中str是您的JSON字符串:

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

错误是错误域= NSCocoaErrorDomain代码= 3840“操作无法完成。(可可错误3840。)”(JSON文本未以数组或对象开头,并且未设置允许片段的选项。)UserInfo = 0x1f5b3660 {NSDebugDescription = JSON文本不是以数组或对象开头,并且没有允许不设置片段的选项。}
GuybrushThreepwood 2013年

事情是畸形在你的JSON数据
伍德斯托克

2

斯威夫特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];
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.