在 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 字符串的主要内容,如果未能解决你的问题,请参考以下文章

在 JSON 中反序列化 Set 时出错

jQuery/ASMX:在 C# 中反序列化 JSON 时出错

如何在 C# .NET 中反序列化复杂的 JSON 对象?

在 C# 中反序列化 JSON 数组

在 Flutter 中反序列化 JSON 数据

在javascript中反序列化json对象