【问题标题】:Deserialise JSON String in Objective C在 Objective C 中反序列化 JSON 字符串
【发布时间】: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。我必须多次反序列化数据,但我没有这样做。
  • 你的意思是你必须反序列化键中的每一个值吗?
  • 是的,这样我就可以使用该值。但我无法解析我获得的字符串。

标签: ios objective-c 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:@"'"];

然后使用这个格式化字符串。

【讨论】:

【解决方案2】:

我已经从Json formatter & Validator 调查了你的 json 文件,你的 json 文件中有很多错误,所以首先从这个验证器检查你的文件,这个格式化程序会给你错误的描述。重新构建您的 json 文件,如果您仍然遇到任何问题,请询问。

【讨论】:

  • 字符串没有问题,因为纯不是json字符串,但是可以解析。我很快就做到了。我可以访问 IsAuth 的值。我无法在目标 C 中做到这一点。
猜你喜欢
  • 2021-09-02
  • 1970-01-01
  • 1970-01-01
  • 2011-10-06
  • 1970-01-01
  • 1970-01-01
  • 2020-09-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多