解析稍微复杂一点的数据

碰到如上图所示的数据需要我们解析,用"name"的值作为分区头标题,用上图所圈起来的字典作为一个model,我们可以用两种方式解析:

第一种方式:就是使用一个数组和一个字典,数组用来存储"name"里的值,作为key;字典用来存储所有数据;

第二种方式:就是使用两个数组,其中一个数组用来存储"name"的值,另一个数组存储所有数据;

闲言修叙:直接上代码

第一种方式:

#import "RootTableViewController.h"
#import "YHCell.h"

@interface RootTableViewController ()

@property (nonatomic, strong) NSMutableArray *allKeysArray;
@property (nonatomic, strong) NSMutableDictionary *allDataDict;

@end

@implementation RootTableViewController

// 懒加载
- (NSMutableDictionary *)allDataDict {

    if (!_allDataDict) {
        _allDataDict = [NSMutableDictionary dictionary];
    }
    return _allDataDict;
}

- (NSMutableArray *)allKeysArray {

    if (!_allKeysArray) {
        _allKeysArray = [NSMutableArray array];
    }
    return _allKeysArray;
}

- (void)viewDidLoad {
    [super viewDidLoad];

    self.navigationItem.title = @"旅游";
    self.tableView.showsVerticalScrollIndicator = NO;

    // 数据处理
    [self loadWebData];

    // 注册cell
    [self.tableView registerClass:[YHCell class] forCellReuseIdentifier:@"cell"];

}

// 数据处理
- (void)loadWebData {
    NSURL *url = [NSURL URLWithString:@"http://api.yhouse.com/m/city/dynmiclist"];
    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    NSURLSession *session = [NSURLSession sharedSession];

    NSURLSessionTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        if (error == nil) {

            NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil];
            NSDictionary *dict1 = dict[@"data"];
            NSArray *array = dict1[@"allCity"];

            for (int i = 0; i < array.count; i++) {
                NSDictionary *dict2 = array[i];

                NSMutableArray *dataArray = [NSMutableArray array];
                for (NSString *key in dict2) {

                    if ([key isEqualToString:@"name"]) {
                        NSString *value = dict2[key];
                        [self.allKeysArray addObject:value];
                    }

                    if ([key isEqualToString:@"tabs"]) {
                        for (NSDictionary *dict3 in dict2[key]) {
                            Model *model = [[Model alloc] init];
                            [model setValuesForKeysWithDictionary:dict3];
                            [dataArray addObject:model];
                        }
                    }
                }
                [self.allDataDict setObject:dataArray forKey:[self.allKeysArray lastObject]];
            }
            [self.tableView reloadData];
        }
    }];

    [task resume];
}

// 设置分区个数
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {

    return self.dataHandle.allKeysArray.count;
}

// 设置每个分区的行数
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {

    NSString *key = self.dataHandle.allKeysArray[section];
    NSInteger index = [self.dataHandle.allDataDict[key] count];
    return index;
}

// 返回cell
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    YHCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell" forIndexPath:indexPath];

    Model *model = [[Model alloc] init];
    NSString *key = self.dataHandle.allKeysArray[indexPath.section];
    model = self.dataHandle.allDataDict[key][indexPath.row];

    // 给cell赋值
    [cell bindModel:model];

    return cell;
}

// 设置cell高度
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {

    return 50;
}

// 设置头标题
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {

    return self.dataHandle.allKeysArray[section];
}

@end

第一种方式中间的解析数据也可以全用foin循环来解析,也就是还可以简化一点代码:

- (void)loadWebData {
    NSURL *url = [NSURL URLWithString:@"http://api.yhouse.com/m/city/dynmiclist"];
    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    NSURLSession *session = [NSURLSession sharedSession];

    NSURLSessionTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        if (error == nil) {

            NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil];
            NSDictionary *dict1 = dict[@"data"];
            NSArray *array = dict1[@"allCity"];

            for (NSDictionary *dict2 in array) {
                [self.allKeysArray addObject:dict2[@"name"]];

                NSMutableArray *array1 = [NSMutableArray array];
                for (NSDictionary *dict3 in dict2[@"tabs"]) {
                    Model *model = [[Model alloc] init];
                    [model setValuesForKeysWithDictionary:dict3];
                    [array1 addObject:model];
                }
                [self.allDataDict setObject:array1 forKey:[self.allKeysArray lastObject]];
            }
        }
        [self.tableView reloadData];
    }];

    [task resume];
}

第二种方法:

#import "RootTableViewController.h"
#import "YHCell.h"

@interface RootTableViewController ()

@property (nonatomic, strong) NSMutableArray *allKeysArray;
@property (nonatomic ,strong) NSMutableArray *allDataArray;

@end

@implementation RootTableViewController

// 懒加载
- (NSMutableArray *)allKeysArray {

    if (!_allKeysArray) {
        _allKeysArray = [NSMutableArray array];
    }
    return _allKeysArray;
}

- (NSMutableArray *)allDataArray {

    if (!_allDataArray) {
        _allDataArray = [NSMutableArray array];
    }
    return _allDataArray;
}

- (void)viewDidLoad {
    [super viewDidLoad];

    self.navigationItem.title = @"旅游";
    self.tableView.showsVerticalScrollIndicator = NO;

    // 数据处理
    [self loadData];

    // 注册cell
    [self.tableView registerClass:[YHCell class] forCellReuseIdentifier:@"cell"];

}

// 数据处理
- (void)loadData {

    NSURL *url = [NSURL URLWithString:@"http://api.yhouse.com/m/city/dynmiclist"];

    NSURLSession *session = [NSURLSession sharedSession];
    NSURLSessionTask *task = [session dataTaskWithURL:url completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {

        NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil];
        NSDictionary *dict1 = dict[@"data"];
        NSArray *array = dict1[@"allCity"];

        for (NSDictionary *dict2 in array) {

            NSMutableArray *array1 =[NSMutableArray array];

            [self.allKeysArray addObject:dict2[@"name"]];

            for (NSDictionary *dict3 in dict2[@"tabs"]) {
                Model *model = [[Model alloc] init];
                [model setValuesForKeysWithDictionary:dict3];
                [array1 addObject:model];
            }

            [self.allDataArray addObject:array1];
        }
        [self.tableView reloadData];

    }];

    [task resume];

}

// 分区个数
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {

    return self.allKeysArray.count;
}

// 每个分区的行数
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {

    return [self.allDataArray[section] count];
}

// 返回cell
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    YHCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell" forIndexPath:indexPath];

    Model *model = [[Model alloc] init];
    NSArray *array = self.allDataArray[indexPath.section];
    model = array[indexPath.row];

    // 给cell赋值
    [cell bindModel:model];

    return cell;
}

// 设置cell高度
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {

    return 50;
}

// 设置头标题
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {

    return self.allKeysArray[section];
}

@end
时间: 2024-10-23 10:15:47

解析稍微复杂一点的数据的相关文章

程序员生存定律--如何尽快变的稍微专业一点

程序员生存定律这系列的目录在这里:程序员生存定律--目录 喜欢从头瞄的,可以移步. ------------------------------------------------------------------------------- 1 掌握读代码的方法和技巧 不管最终想成为什么,刚入行之后,一定离不开的是读代码和写代码.这里将介绍一些读代码的方法和技巧. 读代码这事,先要分是精读还是泛读.从学习的目的来看,一定要精读一定量的经典代码.而精读是指每行都读懂,不看代码脑子里就能勾画出程序

几行Python代码快速解析、整理上万份数据文件

在这个世界上,人们每天都在用 Python 完成着不同的工作.而文件操作,则是大家最常需要解决的任务之一.使用 Python,你可以轻松为他人生成精美的报表,也可以用短短几行代码快速解析.整理上万份数据文件. 当我们编写与文件相关的代码时,通常会关注这些事情:我的代码是不是足够快?我的代码有没有事半功倍的完成任务? 在这篇文章中,我会与你分享与之相关的几个编程建议.我会向你推荐一个被低估的 Python 标准库模块.演示一个读取大文件的最佳方式.最后再分享我对函数设计的一点思考. 下面,让我们进

与下位机或设备的通信解析优化的一点功能(续补):动态编译

原文:与下位机或设备的通信解析优化的一点功能(续补):动态编译 继上一篇<与下位机或设备的通信解析优化的一点功能:T4+动态编译>  ,现在已经生成出解析用的类的C#源码了,接下来,就轮到动态编译生成Type了. 在实现上,.net framework和.net core上,有些不同: .Net Framework的: 1 var transfer = ""; //解析后的C#源码字符串 2 3 ICodeCompiler comp = new CSharpCodeProv

与下位机或设备的通信解析优化的一点功能:T4+动态编译

原文:与下位机或设备的通信解析优化的一点功能:T4+动态编译     去年接触的一个项目中,需要通过TCP与设备进行对接的,传的是Modbus协议的数据,然后后台需要可以动态配置协议解析的方式,即寄存器的解析方式,,配置信息有:Key,数据Index,源数据类型,数据库列类型,数据排列方式 一开始使用的方式是,从数据库读取出协议的配置,然后在接收到数据的时候,循环每个配置项根据配置-----解析数据------转换类型----存临时列表,,后来改进了一下,配置项存缓存,,数据库修改的时候,同时更

WebService传递XML数据 C#DataSet操作XML 解析WebService返回的XML数据

Webservice传递的数据只能是序列化的数据,典型的就是xml数据.   /// <summary>         /// 通过用户名和密码 返回下行数据         /// </summary>         /// <param name="UserName">用户名</param>         /// <param name="UserPwd">密码</param>    

将Array格式的数据解析成JSON格式的数据

在编程的过程中,数据的传输格式如何,会影响开发的效率和后期代码的维护, 并且现在许多的js中支持了JSON格式的数据, 比如angular.nodejs.本篇文章主要讲解Array(数组)形式数据的解析.其它格式的数据会在后续的文章中进行书写. (1)定义一个解析Array的类JSONArray. public class JSONArray { @SuppressWarnings("unchecked") public static String toJSONString(List

解析PE文件的附加数据

解析程序自己的附加数据,将附加数据写入文件里. 主要是解析PE文件头.定位到overlay的地方.写入文件. 常应用的场景是在crackme中,crackme自身有一段加密过的附加数据.在crackme执行的过程中解析自己的附加数据,然后解密这段数据.. .. 代码留存: //解析自己的PE文件 TCHAR szModuleFile[MAX_PATH] = {0}; ::GetModuleFileName(NULL, szModuleFile, MAX_PATH); HANDLE hFile =

解析磁盘0号扇区数据

自己写了一个简单工具,可读取磁盘扇区数据.也可下载其他工具查看.本人磁盘0号扇区数据如下 这个0号磁盘是整个磁盘的第一个扇区,称为MBR(Master Boot Record )主引导记录. 此扇区的前446个字节是引导程序,在BIOS的代码执行到最后时,BIOS会将这段程序加载到内存中并开始执行.后面的64字节是硬盘分区表. 从0x1BE~0x1FE 共64字节,是4个分区表项,0x1be~0x1cd为第一个分区表项,0x1ce~0x1dd为第二个分区表项,0x1de~0xed为第三个分区表项

在AFN中使用NSXMLParser解析服务器返回的XML数据

服务器返回的XML格式: 因为苹果没有提供直接获取xml开始标签和结束标签中间的字符串,虽然提供了 - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string这个方法获取中间的字符串,但是这个字符串包含了空格和回车,所以要在这个方法中进行过滤. 源代码如下: 8 9 #import "RecommendController.h" 11 #import "SPHTTPRequestTool.h&