iosjson解析数据(ios 解析json)
更新:2022-11-08 20:38
本文目录一览:
- [iOS Swift JSONEncoder和JSONDecoder解析数据](#iOS Swift JSONEncoder和JSONDecoder解析数据)
- [ios json 怎么解析](#ios json 怎么解析)
- 在ios中json数据怎么解析
- 怎么生成和解析iOS开发JSON格式数据
iOS Swift JSONEncoder和JSONDecoder解析数据
本人亲测有效!绝对可靠!更多交流可以家魏鑫:lixiaowu1129,一起探讨iOS相关技术!
一个对象如果需要被编码/解码的话,该对象所属的类需要遵循 Decodable
Encodable
协议。
以 Player
这类为例,Player
遵循了 Decodable
和 Encodable
初始化一个 Player
对象,并对其进行编码和解码,看看编码和解码之后的数据
一个对象被 jsonEncode
后,对象将被转成 Data
类型的数据。
再将对象的 Data
数据通过 jsonDecode
,可以还原原来的对象。
通过对对象的 json
编码和解码,有助于我们理解数据在计算机中的存储。Data
其本质就是二进制流。
这是一个字符串
如何将其解析成 player
对象?
这种情况多用于客户端向服务端发送 HTTP 请求之后,解析返回数据,如果后台返回的是标准的 JSON 字符串的话直接这样解析就可以了。
Serialization
是序列化的意思,JSONSerialization
顾名思义是对 JSON 进行序列化。
JSONSerialization
是对 JSON 字符串进行序列化和反序列化的工具类。用这个类可以将 JSON 转成对象,也可以将对象转成 JSON。
打印结果为:
这是一个标准的,带转义的 JSON 字符串。也就是说我们将字典转成了 JSON 字符串。
打印结果为:
ios json 怎么解析
刚刚下午那会 弄了个 解析 xml demo 的小例子,本想着 json 也挺复杂 弄还是 不弄,但是简单的看了下 发现挺简单 考虑了很久,还是写上来吧,毕竟 json 用得太多了,而且算是自己的积累吧,毕竟刚开始学习 IOS 开发方面的知识,就当是巩固了撒!
还是 先看个效果图吧,如下!接下来 看下工程目录吧,其实并没有必要,直接建立一个工程就行 ,算了,还是贴上来吧,如下:
工程目录中有个 Notes.json
文件,该文件就是 要解析的 json 数据了 ,也截下图吧,如下:
Ok ,以上准备完毕,就开始编码了,在此之前故事版的内容 就和我上篇博客文章 IOS 解析 xml 故事版 是一样配置的,这里就不在啰嗦了 ,首先看下 chonViewController.h
文件,代码如下:
//
// chonViewController.h
// TestJson
//
// Created by choni on 14-5-16.
// Copyright (c) 2014年 choni. All rights reserved.
//
#import <UIKit/UIKit.h>
@interface chonViewController : UITableViewController
//保存数据列表
@property(nonatomic,strong) NSMutableArray * listData;
@end
与之对应的 chonViewController.m
文件 代码如下:
//
// chonViewController.m
// TestJson
//
// Created by choni on 14-5-16.
// Copyright (c) 2014年 choni. All rights reserved.
//
#import "chonViewController.h"
@interface chonViewController ()
@end
@implementation chonViewController
- (void)viewDidLoad {
[super viewDidLoad];
NSString * path = [[NSBundle mainBundle] pathForResource:@"Notes" ofType:@"json"];
NSData * jsonData = [[NSData alloc] initWithContentsOfFile:path];
NSError * error;
id jsonObj = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableContainers error:error];
if (!jsonObj || error) {
NSLog(@"JSON解析失败");
}
self.listData = [jsonObj objectForKey:@"Record"];
}
#pragma mark - tableView
-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return 1;
}
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return self.listData.count;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];
NSMutableDictionary * dict = self.listData[indexPath.row];
cell.textLabel.text = [dict objectForKey:@"Content"];
cell.detailTextLabel.text = [dict objectForKey:@"CDate"];
return cell;
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
}
@end
Ok , 现在就可以编译运行的程序了 ,但是有个主意的地方 :
- 因为使用
NSJSONSerialization
实现 json 解码,要确定你得项目使用 IOS 5 SDK 才可以 - 其他的就没有什么了,介绍下
NSJSONSerialization
的类方法吧 1)NSJSONReadingMutableContaines
,指定解析返回的是可变的数组或字典 ,这个方法还是比较使用的,因为如果 json 数据需要改,不用管撒
2)NSJSONReadingMutableLeaves
,指定叶节点是可变的字符串
NSJSONReadingAllowFragments
, 指定顶级节点可以部署数组或字典
在ios中json数据怎么解析
刚刚下午那会 弄了个 解析 xml demo的小例子,本想着json也挺复杂 弄还是 不弄,但是简单的看了下 发现挺简单
考虑了很久,还是写上来吧,毕竟 json 用得太多了,而且算是自己的积累吧,毕竟刚开始学习 IOS 开发方面的知识,就当是巩固了撒!
还是 先看个效果图吧,如下!
接下来 看下工程目录吧,其实并没有必要,直接建立一个工程就行 ,算了,还是贴上来吧,如下:
工程目录中有个 Notes.json
文件,该文件就是 要解析的 json 数据了 ,也截下图吧,如下:
Ok ,以上准备完毕,就开始编码了,在此之前故事版的内容 就和我上篇博客文章 IOS 解析 xml 故事版 是一样配置的,这里就不在啰嗦了 ,首先看下 chonViewController.h
文件,代码如下:
//
// chonViewController.h
// TestJson
//
// Created by choni on 14-5-16.
// Copyright (c) 2014年 choni. All rights reserved.
//
#import <UIKit/UIKit.h>
@interface chonViewController : UITableViewController
//保存数据列表
@property(nonatomic,strong) NSMutableArray * listData;
@end
与之对应的 chonViewController.m
文件 代码如下:
//
// chonViewController.m
// TestJson
//
// Created by choni on 14-5-16.
// Copyright (c) 2014年 choni. All rights reserved.
//
#import "chonViewController.h"
@interface chonViewController ()
@end
@implementation chonViewController
- (void)viewDidLoad {
[super viewDidLoad];
NSString * path = [[NSBundle mainBundle] pathForResource:@"Notes" ofType:@"json"];
NSData * jsonData = [[NSData alloc] initWithContentsOfFile:path];
NSError * error;
id jsonObj = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableContainers error:error];
if (!jsonObj || error) {
NSLog(@"JSON解析失败");
}
self.listData = [jsonObj objectForKey:@"Record"];
}
#pragma mark - tableView
-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return 1;
}
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return self.listData.count;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];
NSMutableDictionary * dict = self.listData[indexPath.row];
cell.textLabel.text = [dict objectForKey:@"Content"];
cell.detailTextLabel.text = [dict objectForKey:@"CDate"];
return cell;
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
}
@end
Ok , 现在就可以编译运行的程序了 ,但是有个主意的地方 :
- 因为使用
NSJSONSerialization
实现 json 解码,要确定你得项目使用 IOS 5 SDK 才可以 - 其他的就没有什么了,介绍下
NSJSONSerialization
的类方法吧 1)NSJSONReadingMutableContaines
,指定解析返回的是可变的数组或字典 ,这个方法还是比较使用的,因为如果 json 数据需要改,不用管撒
2)NSJSONReadingMutableLeaves
,指定叶节点是可变的字符串
NSJSONReadingAllowFragments
, 指定顶级节点可以部署数组或字典
怎么生成和解析iOS开发JSON格式数据
导语:JSON 作为数据包格式传输的时候具有更高的效率,这是因为 JSON 不像 XML 那样需要有严格的闭合标签,这就让有效数据量与总数据包比大大提升,从而减少同等数据流量的情况下,网络的传输压力。JSON 可以将 JavaScript 对象中表示的一组数据转换为字符串,然后就可以在函数之间轻松地传递这个字符串,或者在异步应用程序中将字符串从 Web 客户机传递给服务器端程序。这个字符串看起来有点儿古怪,但是 JavaScript 很容易解释它,而且 JSON 可以表示比"名称 / 值对"更复杂的结构。例如,可以表示数组和复杂的对象,而不仅仅是键和值的简单列表。
怎么生成和解析iOS开发JSON格式数据?
一、如何生成JSON格式的数据?
- 利用字典
NSDictionary
转换为键/值格式的数据。
// 如果数组或者字典中存储了 NSString, NSNumber, NSArray, NSDictionary, or NSNull 之外的其他对象,就不能直接保存成文件了.也不能序列化成 JSON 数据.
NSDictionary *dict = @{@"name" : @"me", @"do" : @"something", @"with" : @"her", @"address" : @"home"};
// 1.判断当前对象是否能够转换成JSON数据.
// YES if obj can be converted to JSON data, otherwise NO
BOOL isYes = [NSJSONSerialization isValidJSONObject:dict];
if (isYes) {
NSLog(@"可以转换");
/* JSON data for obj, or nil if an internal error occurs. The resulting data is a encoded in UTF-8. */
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dict options:0 error:NULL];
/* Writes the bytes in the receiver to the file specified by a given path.
YES if the operation succeeds, otherwise NO */
// 将 JSON 数据写成文件
// 文件添加后缀名: 告诉别人当前文件的类型.
// 注意: AFN 是通过文件类型来确定数据类型的!如果不添加类型,有可能识别不了! 自己最好添加文件类型.
[jsonData writeToFile:@"/Users/SunnyBoy/Sites/JSON_XML/dict.json" atomically:YES];
NSLog(@"%@", [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]);
} else {
NSLog(@"JSON数据生成失败,请检查数据格式");
}
- 通过 JSON 序列化可以转换数组,但转换结果不是标准化的 JSON 格式。
NSArray *array = @[@"qn", @18, @"ya", @"wj"];
BOOL isYes = [NSJSONSerialization isValidJSONObject:array];
if (isYes) {
NSLog(@"可以转换");
NSData *data = [NSJSONSerialization dataWithJSONObject:array options:0 error:NULL];
[data writeToFile:@"/Users/SunnyBoy/Sites/JSON_XML/base" atomically:YES];
} else {
NSLog(@"JSON数据生成失败,请检查数据格式");
}
二、如何解析JSON格式的数据?
- 使用 TouchJSon 解析方法:(需导入包:
#import "TouchJson/JSON/CJSONDeserializer.h"
)
//使用TouchJson来解析北京的天气
//获取API接口
NSURL *url = [NSURL URLWithString:@""];
//定义一个NSError对象,用于捕获错误信息
NSError *error;
NSString *jsonString = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:error];
NSLog(@"jsonString---%@",jsonString);
//将解析得到的内容存放字典中,编码格式为UTF8,防止取值的时候发生乱码
NSDictionary *rootDic = [[CJSONDeserializer deserializer] deserialize:[jsonString dataUsingEncoding:NSUTF8StringEncoding] error:error];
//因为返回的Json文件有两层,去第二层内容放到字典中去
NSDictionary *weatherInfo = [rootDic objectForKey:@"weatherinfo"];
NSLog(@"weatherInfo---%@",weatherInfo);
//取值打印
NSLog(@"%@",[NSString stringWithFormat:@"今天是 %@ %@ %@ 的天气状况是:%@ %@ ",[weatherInfo objectForKey:@"date_y"],[weatherInfo objectForKey:@"week"],[weatherInfo objectForKey:@"city"], [weatherInfo objectForKey:@"weather1"], [weatherInfo objectForKey:@"temp1"]]);
- 使用 SBJson 解析方法:(需导入包:
#import "SBJson/SBJson.h"
)
//使用SBJson解析北京的天气
NSURL *url = [NSURL URLWithString:@""];
NSError *error = nil;
NSString *jsonString = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:error];
SBJsonParser *parser = [[SBJsonParser alloc] init];
NSDictionary *rootDic = [parser objectWithString:jsonString error:error];
NSDictionary *weatherInfo = [rootDic objectForKey:@"weatherinfo"];
NSLog(@"%@", [NSString stringWithFormat:@"今天是 %@ %@ %@ 的天气状况是:%@ %@ ",[weatherInfo objectForKey:@"date_y"],[weatherInfo objectForKey:@"week"],[weatherInfo objectForKey:@"city"], [weatherInfo objectForKey:@"weather1"], [weatherInfo objectForKey:@"temp1"]]);
- 使用 IOS5 自带解析类
NSJSONSerialization
方法解析:(无需导入包,IOS5 支持,低版本 IOS 不支持)
// 从中国天气预报网请求数据
NSURL *url = [ NSURL URLWithString:@""];
// 创建请求
NSURLRequest *request = [NSURLRequest requestWithURL:url];
[[[NSURLSession sharedSession] dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
// 在网络完成的 Block 回调中,要增加错误机制.
// 失败机制处理: 错误的状态码!
// 最简单的错误处理机制:
if (data && !error) {
// JSON格式转换成字典,IOS5中自带解析类NSJSONSerialization从response中解析出数据放到字典中
id obj = [NSJSONSerialization JSONObjectWithData:data options:0 error:NULL];
NSDictionary *dict = obj[@"weatherinfo"];
NSLog(@"%@---%@", dict, dict[@"city"]);
}
}] resume];
- 使用 JSONKit 的解析方法:(需导入包:
#import "JSONKit/JSONKit.h"
)
//如果json是“单层”的,即value都是字符串、数字,可以使用objectFromJSONString
NSString *json1 = @"{\"a\":123, \"b\":\"abc\"}";
NSLog(@"json1:%@",json1);
NSDictionary *data1 = [json1 objectFromJSONString];
NSLog(@"json1.a:%@",[data1 objectForKey:@"a"]);
NSLog(@"json1.b:%@",[data1 objectForKey:@"b"]);
//如果json有嵌套,即value里有array、object,如果再使用objectFromJSONString,程序可能会报错(测试结果表明:使用由网络或得到的php/json_encode生成的json时会报错,但使用NSString定义的json字符串时,解析成功),最好使用objectFromJSONStringWithParseOptions:
NSString *json2 = @"{\"a\":123, \"b\":\"abc\", \"c\":[456, \"hello\"], \"d\":{\"name\":\"张三\", \"age\":\"32\"}}";
NSLog(@"json2:%@", json2);
NSDictionary *data2 = [json2 objectFromJSONStringWithParseOptions:JKParseOptionLooseUnicode];
NSLog(@"json2.c:%@", [data2 objectForKey:@"c"]);
NSLog(@"json2.d:%@", [data2 objectForKey:@"d"]);