解析两个 JSON 对象

Posted

技术标签:

【中文标题】解析两个 JSON 对象【英文标题】:Parse two JSON objects 【发布时间】:2017-08-29 05:13:15 【问题描述】:

当我发送 API 时,我会收到这样的 JSON 响应。

"ABC":["ID1":"response","ID2":"response","ID3":"response","ID4":"response","ID5":"response" ,"ID1":"response","ID2":"response","ID3":"response","ID4":"response","ID5":"response","ID1":"response ","ID2":"response","ID3":"response","ID4":"response","ID5":"response"],"status":"OK","count":3

"XYZ":["id1":"response","id1":"response","id1":"response"],"status":"OK","count ":3

我在响应中得到 两个 JSON 对象。如何将这些数据存储在 MutableArrays 中。

我的代码是...

//Getting data from server through JSON approach ...
self.urlSession = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];
self.urlReq= [NSMutableURLRequest requestWithURL:[NSURL URLWithString:[[NSString alloc] initWithFormat:@"http://MyApiName"]]];

self.dataTask = [self.urlSession dataTaskWithRequest:self.urlReq completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) 
        
        if (!(data == nil)) 
            
            self.loginDic = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];
            NSLog(@"data : %@", data);
            NSLog(@"Login Dic : %@", [self.loginDic objectForKey:@"ABC"]);

            if (!(self.loginDic == nil)) 
                
                self.integer = [[self.loginDic objectForKey:@"ABC"] count];
                
                if ([[self.loginDic objectForKey:@"status"] isEqualToString:@"OK"] && (!(self.integer == 0))) 
                    
                    self.ID1 = [[NSMutableArray alloc]init];
                    self.ID2 = [[NSMutableArray alloc]init];
                    self.ID3 = [[NSMutableArray alloc]init];
                    self.ID4 = [[NSMutableArray alloc]init];
                    self.ID5 = [[NSMutableArray alloc]init];
                    
                    for (int i=0; i<self.integer; i++) 
                            
                        [self.ID1 addObject:[[[self.loginDic objectForKey:@"ABC"] objectAtIndex:i] objectForKey:@"ID1"]];
                        [self.ID2 addObject:[[[self.loginDic objectForKey:@"ABC"] objectAtIndex:i] objectForKey:@"ID2"]];
                        [self.ID3 addObject:[[[self.loginDic objectForKey:@"ABC"] objectAtIndex:i] objectForKey:@"ID3"]];
                        [self.ID4 addObject:[[[self.loginDic objectForKey:@"ABC"] objectAtIndex:i] objectForKey:@"ID4"]];
                        [self.ID5 addObject:[[[self.loginDic objectForKey:@"ABC"] objectAtIndex:i] objectForKey:@"ID5"]];                                
                    
                    
                    NSLog(@"%@", self.ID1);
                    NSLog(@"%@", self.ID2);
                    
                 else 
                    
                
                
             else 
            
            
            
         else 
            
        
        
    ];
    
    [self.dataTask resume];


我正在获取数据,但我正在获取loginDic = null

【问题讨论】:

首先,您发布的 JSON 不是有效的。第二件事是您的代码没有任何意义,因为您的 JSON 中的键和代码中的键不同。 你是从服务器这样发送的吗? @Midhun MP 很抱歉我编辑了上面的代码... @iosDeveloper:你能更新一下 JSON 吗?它仍然无效(您可以在此处验证您的 JSON:jsoneditoronline.org)。但是如果你从这样的服务器获取结果,这就是你在解析 JSON 时得到 null 的原因。 我遇到了错误。是的,谢谢你... 【参考方案1】:

得到 AB 后,它的 Dictionary 数组

您可以轻松地使用这个 valueForKeyPath,例如:

   NSArray * AB = @[@
                      @"ID1":@"response",
                       @"ID2":@"response",
                      @"ID3":@"response",
                      @"ID4":@"response",
                      @"ID5":@"response",
                     ,@
                @"ID1":@"response",
                @"ID2":@"response",
                @"ID3":@"response",
                @"ID4":@"response",
                @"ID5":@"response"
                ];



    NSArray * ID1 = [AB valueForKeyPath:@"ID1"];
    NSArray * ID2 = [AB valueForKeyPath:@"ID2"];

【讨论】:

【参考方案2】:

如何一次接收两个 JSON 对象?

您显示的 JSON 确实是两个连接的有效 JSON 编码。如果您的服务器正在执行此操作,并且您无法修复它,那么您可以尝试自己修复它:

    任何出现的][][ 以及两个字符之间的任意数量的空格都是一个 JSON 编码的结束和下一个 JSON 编码的开始。构造一个NSRegularExpression 来查找这些序列,并将它们替换为相同的右/左括号/大括号组合,但在它们之间使用逗号 (,)。 在开头添加一个 [,在末尾添加一个 ]

这两个步骤会将您连接的 JSON 编码转换为单个编码的 JSON 数组。现在像往常一样解析和处理,记住您首先需要索引到最外层的数组以访问特定的 JSON 响应,然后再索引到响应以访问您需要的元素。

HTH

【讨论】:

以上是关于解析两个 JSON 对象的主要内容,如果未能解决你的问题,请参考以下文章

Python使用json加载解析带有两个json对象列表的文件

js解析与序列化json数据(一)json.stringify()的基本用法

如何解析包含对象列表的 JSON

String转json,多层json解析,并使用JsonElement对比两个json对象的值是否相等

String转json,多层json解析,并使用JsonElement对比两个json对象的值是否相等

python json 解析