一尘不染

如何使用NSJSONSerialization反序列化转义的JSON字符串?

json

我有一个iOS应用程序,需要处理来自Web服务的响应。响应是包含序列化JSON对象的序列化JSON字符串,如下所示:

"{ \"name\" : \"Bob\", \"age\" : 21 }"

请注意,此响应是JSON 字符串 ,而不是JSON对象。我需要做的是将字符串反序列化,这样我就可以得到:

{ "name" : "Bob", "age" : 21 }

然后我可以+[NSJSONSerialization JSONObjectWithData:options:error:]用来反序列化为NSDictionary

但是,我该如何第一步?也就是说,如何“解串”字符串,以便拥有序列化的JSON对象? +[NSJSONSerialization JSONObjectWithData:options:error:]仅当顶级对象是数组或字典时才有效;它不适用于字符串。

我最终编写了自己的JSON字符串解析器,希望它符合RFC
4627的2.5节
。但是我怀疑我已经忽略了使用NSJSONSerialization其他可行方法进行此操作的简单方法。


阅读 306

收藏
2020-07-27

共1个答案

一尘不染

如果您嵌套了JSON,则只需调用JSONObjectWithData两次:

NSString *string =  @"\"{ \\\"name\\\" : \\\"Bob\\\", \\\"age\\\" : 21 }\"";
// --> the string
// "{ \"name\" : \"Bob\", \"age\" : 21 }"

NSError *error;
NSString *outerJson = [NSJSONSerialization JSONObjectWithData:[string dataUsingEncoding:NSUTF8StringEncoding]
                              options:NSJSONReadingAllowFragments error:&error];
// --> the string
//  { "name" : "Bob", "age" : 21 }
NSDictionary *innerJson = [NSJSONSerialization JSONObjectWithData:[outerJson dataUsingEncoding:NSUTF8StringEncoding]
                              options:0 error:&error];
// --> the dictionary
// { age = 21; name = Bob; }
2020-07-27