在 Objective C 中反序列化 JSON 字符串
Posted
技术标签:
【中文标题】在 Objective C 中反序列化 JSON 字符串【英文标题】:Deserialise JSON String in Objective C 【发布时间】:2016-12-30 06:13:41 【问题描述】:我从 REST API 收到 NSData 对象 data
。其中包含我要解析的 JSON 数据。
JsonResult = "[
\"IsAuth\":\"true\",
\"User\":\"
[
\\\"userid\\\":\\\"josephH\\\",
\\\"firstname\\\":\\\"joseph\\\",
\\\"lastname\\\":\\\"Henry\\\",
]\"]"
这个语句给了我一个字符串的结果,如下所示,我无法将其解析为 JSON。
myData = [data valueForKey:@"JsonResult"];
"[
\"IsAuth\":\"true\",
\"User\":\"
[
\\\"userid\\\":\\\"josephH\\\",
\\\"firstname\\\":\\\"joseph\\\",
\\\"lastname\\\":\\\"Henry\\\",
]\"]"
当我尝试将此 mydata
传递给 JSONSerialization
时,代码会崩溃。
如何将上面的字符串转换为 NSDictionary 以便我可以解析它们并使用 IsAuth 和 User 的值?
代码:
[LDService authenticateUser:Uname.text passwordString:Password.text completeBlock:^(NSData * data)
NSError *error;
NSData *jsonData;
NSString *jsonString = nil;
NSMutableDictionary *jsonDict;
if([NSJSONSerialization isValidJSONObject:data])
jsonData = [NSJSONSerialization dataWithJSONObject:data
options:kNilOptions
error:&error];
jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
NSString *formattedString = [jsonString stringByReplacingOccurrencesOfString:@"\\\"" withString:@"'"];
NSLog(@"Formatted string %@",formattedString);
[jsonDict setObject:formattedString forKey:@"JsonResult"];
NSLog(@"Parsed json %@",jsonDict);
];
【问题讨论】:
您的响应 JsonResult 是字符串而不是正确的 JSON。 您可以检查您的 JSON 格式无效:jsonviewer.stack.hu 其实我已经多次序列化了json。所以 JsonResult 是一个字符串,但它包含类似于 JSON 的数据。我已经缩短了 JSON 结果,但最初它是一个长 JSON,其中包含一个字符串中的 JSON。我必须多次反序列化数据,但我没有这样做。 你的意思是你必须反序列化键中的每一个值吗? 是的,这样我就可以使用该值。但我无法解析我获得的字符串。 【参考方案1】:以data
的形式传递您的数据
NSError *error;
NSString *jsonString = nil;
if([NSJSONSerialization isValidJSONObject:data])
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:data
options:kNilOptions
error:&error];
jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
然后将出现的@"\\\"
替换为@"'"
NSString *formattedString = [jsonString stringByReplacingOccurrencesOfString:@"\\\"" withString:@"'"];
然后使用这个格式化字符串。
【讨论】:
评论不用于扩展讨论;这个对话是moved to chat。【参考方案2】:我已经从Json formatter & Validator 调查了你的 json 文件,你的 json 文件中有很多错误,所以首先从这个验证器检查你的文件,这个格式化程序会给你错误的描述。重新构建您的 json 文件,如果您仍然遇到任何问题,请询问。
【讨论】:
字符串没有问题,因为纯不是json字符串,但是可以解析。我很快就做到了。我可以访问 IsAuth 的值。我无法在目标 C 中做到这一点。以上是关于在 Objective C 中反序列化 JSON 字符串的主要内容,如果未能解决你的问题,请参考以下文章