objective c 数组-c以json方式向后台传数组,应该怎么办

objective-c以json方式向后台传数组,应该怎么办? - 知乎9被浏览9718分享邀请回答/p/130daa0c2fe7 0添加评论分享收藏感谢收起问题对人有帮助,内容完整,我也想知道答案
问题没有实际价值,缺少关键内容,没有改进余地
NSDictionary *dic = @{@"url": @"http://..."};
NSLog(@"%@", dic);
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dic options:NSJSONWritingPrettyPrinted error:nil];
NSString *jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
NSLog(@"%@", jsonString);
执行结果:
14:44:19.427 main[4] {
url = "http://...";
14:44:19.429 main[4] {
"url" : "http:\/\/..."
转换后的json字符串中url地址被转义了 :(
使用字符串替换可以事后弥补:
[jsonString stringByReplacingOccurrencesOfString:@"\\" withString:@""];
如何事先预防呢?
PS:在和UIWebView进行js调用时需要不转义的json字符串,所以还是希望正面解决掉。
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
这个不需要做处理的,直接用就是了。
如果直接取出来显示在 Label 上,内部做过转义的。所以无需理会。
可以参看我写的博客
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
关于 json 标准文档中 \是否应该转义成\/, 我并没细究. 但是很多开源实现 decode 的时候是不会将\/转回\的. 因此我并不同意楼上说的观点, 某些情况下必须要处理, 但我不知道官方NSJSONSerialization的处理方法, 所以改用开源的 jsonkit 绕开了这个问题
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
苹果就是这么任性手动替换一下吧类似:
NSDictionary *policy = ....;
NSData *policyData = [NSJSONSerialization dataWithJSONObject:policy options:kNilOptions error:&error];
if(!policyData && error){
NSLog(@"Error creating JSON: %@", [error localizedDescription]);
//NSJSONSerialization converts a URL string from http://... to http:\/\/... remove the extra escapes
policyStr = [[NSString alloc] initWithData:policyData encoding:NSUTF8StringEncoding];
policyStr = [policyStr stringByReplacingOccurrencesOfString:@"\\/" withString:@"/"];
policyData = [policyStr dataUsingEncoding:NSUTF8StringEncoding];
同步到新浪微博
分享到微博?
你好!看起来你挺喜欢这个内容,但是你还没有注册帐号。 当你创建了帐号,我们能准确地追踪你关注的问题,在有新答案或内容的时候收到网页和邮件通知。还能直接向作者咨询更多细节。如果上面的内容有帮助,记得点赞 (????)? 表示感谢。
明天提醒我
关闭理由:
删除理由:
忽略理由:
推广(招聘、广告、SEO 等)方面的内容
与已有问题重复(请编辑该提问指向已有相同问题)
答非所问,不符合答题要求
宜作评论而非答案
带有人身攻击、辱骂、仇恨等违反条款的内容
无法获得确切结果的问题
非开发直接相关的问题
非技术提问的讨论型问题
其他原因(请补充说明)
我要该,理由是:一、什么是Json?
关于Json的解释还是看百度百科是怎么解释的,这里还是比较专业的。首先我们已经知道了我们对象是什么也知道一些它的基本格式(百度百科有说明)。
我们也来看看我保存在本地的一个Json文件,来具体分析一下它的格式。
先选择左上角的“Outline”模式,我们看见从左到右就是这么三列,分别是“Type”---类型,“Value”---值和“Name”---名字。有的“Name”前面还有一个三角箭头,可以点开看看到底是什么。
里面是字符串形式的数据,再里面就没有什么了。其他的一些就都是形式一样的。
我们还可以选择左上角的Text模式查看这个Json文档。
看见的没一个Value里面的内容的形式都是一样的。
这个Json文件的结构大致是这样的:
最外层是一个字典,字典的一个key CATALOG 对应的Vaule CD 是一个数组,这个数组有25个元素,每个元素又是一个字典,字典里面是六个键值对。这个就是这个Json文件的结构了。
二、Json的解析
Json的解析在Xcode中其实只有简单的三步。
第一步:把字符串形式的链接转换为url形式;
第二步:使用NSData向服务器发送请求下载数据,转化保存为NSData形式;
第三步:调用系统类NSJSONSerialization的 + (id)JSONObjectWithData:(NSData *)data options:(NSJSONReadingOptions)opt error:(NSError **)把返回的数据存储为数组或是字典。为什么是数组和字典呢?
在Xcode里面我们可以在NSJSONSerialization类里面找到这样一个方法:
/* Returns YES if the given object can be converted to JSON data, NO otherwise. The object must have the following properties:
- Top level object is an NSArray or NSDictionary
- All objects are NSString, NSNumber, NSArray, NSDictionary, or NSNull
- All dictionary keys are NSStrings
- NSNumbers are not NaN or infinity
Other rules may apply. Calling this method or attempting a conversion are the definitive ways to tell if a given object can be converted to JSON data.
+ (BOOL)isValidJSONObject:(id)
这个方法是用来判断一个对象是不是一个Json,如果是就返回YES,否则就返回NO。再来看看四行以 “—”开头的说明。
第一句:最外层不是数组就是字典
第二句:所有的对象都是NSString, NSNumber, NSArray, NSDictionary, or NSNull 类型的,(还要包括BOOL类型的)
第三句:所有字典的key都是NSString类型的
第四句:所有的NSNumbers不是NaN(还不知道他的解释)也不是无穷大
这个方法也告诉了我们为什么Json的最外层是数组或是字典和Json中值的类型。
那么解析的三步使用代码怎么实现呢?其实在代码中写简单一点也就三行代码。
NSURL * url = [NSURL URLWithString:PATH];//把字符串类型是路径转换为NSURL 类型的
NSData * data = [NSData dataWithContentsOfURL:url];/向从URL中拿数据,
NSDictionary * dic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];//用一个字典接收返回来的数据。
这里方法里面的参数为什么是这样的?我们可以找到对应的方法的官方的解释。我们只需要按住键盘的“command”键,鼠标移动到方法那里,点击就能自动跳转到相应的方法的申明那里了。
/* Create a Foundation object from JSON data. Set the NSJSONReadingAllowFragments option if the parser should allow top-level objects that are not an NSArray or NSDictionary. Setting the NSJSONReadingMutableContainers option will make the parser generate mutable NSArrays and NSDictionaries. Setting the NSJSONReadingMutableLeaves option will make the parser generate mutable NSString objects. If an error occurs during the parse, then the error parameter will be set and the result will be nil.
The data must be in one of the 5 supported encodings listed in the JSON specification: UTF-8, UTF-16LE, UTF-16BE, UTF-32LE, UTF-32BE. The data may or may not have a BOM. The most efficient encoding to use for parsing is UTF-8, so if you have a choice in encoding the data passed to this method, use UTF-8.
+ (id)JSONObjectWithData:(NSData *)data options:(NSJSONReadingOptions)opt error:(NSError **)剩下的工作就不难完成了。就是怎么从返回的字典中拿我们需要的数据了。这些就和Json的解析没多大关系了。只要理清层级关系,一点一点的拿就行了。
获取字典里面的数据我们可以建立一个模型来获取。在这个Json文件里面,每一张专辑都有六个成员,那么我们就可以以专辑为单位建立模型。然后再把这些模型存储进一个数组里面就可以了。
三、建立模型
上面已经说明了这个Json里面的数据的特点和结构的规律,下面的建立模型就不难了,我们直接看代码。
①建立一个模型类DataModel,它里面有六个成员:
@property (nonatomic,copy) NSString * ARTIST; //艺术家
@property (nonatomic,copy) NSString * COMPANY; //公司
@property (nonatomic,copy) NSString * COUNTRY; //国家
@property (nonatomic,copy) NSString * PRICE; //价格
@property (nonatomic,copy) NSString * TITLE; //专辑名
@property (nonatomic,copy) NSString * YEAR; //年代我们再在解析这个Json类里面声明一个可变数组- (NSArray *)preaseJ
接下里就是解析的代码和模型数据打包了。这段代码理解起来也不困难。
- (NSArray *)preaseJson{
/****************************JSON的解析*************************************/
NSURL * url = [NSURL URLWithString:PATH];
NSData * data = [NSData dataWithContentsOfURL:url];
NSDictionary * dic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
NSArray * cdArr = dic[@&CATALOG&][@&CD&]; //遍历CD对应的数组
for (NSDictionary * di in cdArr) {
DataModel * mo = [[DataModel alloc] init];
mo.ARTIST = di[@&ARTIST&];
mo.COMPANY = di[@&COMPANY&];
mo.COUNTRY = di[@&COUNTRY&];
mo.PRICE = di[@&PRICE&];
mo.TITLE = di[@&TITLE&];
mo.YEAR = di[@&YEAR&];
[_arr addObject:mo];
// KVC (键 --- 值编码)
//这种方法和上面注释的方法二选一,使用这种方法就需要在数据模型里面实现一个打印的方法(这个打印方法可没有),且上面声明的成员的名字必须和字典里面的key名一样。
[mo setValuesForKeysWithDictionary:di];
[_arr addObject:mo];
最后就是打印了
- (void)print{
MyJson * myjson = [[MyJson alloc] init];
NSArray * array = [myjson preaseJson];
int i = 0;
for (DataModel * dm in array) {
printf(&------------- %d -------------\n&,++i);
printf(& ARTIST : %s\n&,[[dm ARTIST] UTF8String]); //艺术家
printf(& COMPANY : %s\n&,[[dm COMPANY] UTF8String]);//唱片公司
printf(& COUNTRY : %s\n&,[[dm COUNTRY] UTF8String]);//国家
printf(& PRICE : %s\n&,[[dm PRICE] UTF8String]); //价格
printf(& TITLE : %s\n&,[[dm TITLE] UTF8String]); //专辑名
printf(& YEAR : %s\n&,[[dm YEAR] UTF8String]); //年代
[dm show]; //这个show方法也是把上面的6行printf封装一下
+ (void)test{
MyJson * js = [[MyJson alloc] init];
[js print];
}最后在main函数里面就只有一条语句:[MyJson test];
就这样数据基本解析出来了。最后的打印结果:一共25个。
如果我们想把数据保存进一个txt文档,就需要文件操作了。前面已经介绍了一种文件操作的方式,现在再来介绍一种文件操作的方式。
四、NSFileManager 类
其实这里的文件的操作也不难,代码量也不大。
+ (void)dataPacket{
MyJson * json = [[MyJson alloc] init];
NSArray * dataArr = [json preaseJson]; // 数组dataArr中存储 解析后的数据模型
NSMutableString * str = [[NSMutableString alloc] init];//新建一个可变字符串
NSFileManager * myFile = [NSFileManager defaultManager];
int i = 0;
for (DataModel * md in dataArr) {
[str appendFormat:@&%d %@&,++i,@&-----------------------------\n&];
[str appendFormat:@&%@%@%@&,@& ARTIST : &,md.ARTIST,@&\n&];
[str appendFormat:@&%@%@%@&,@& COMPANY : &,md.COMPANY,@&\n&];
[str appendFormat:@&%@%@%@&,@& COUNTRY : &,md.COUNTRY,@&\n&];
[str appendFormat:@&%@%@%@&,@& PRICE : &,md.PRICE,@&\n&];
[str appendFormat:@&%@%@%@&,@& TITLE : &,md.TITLE,@&\n&];
[str appendFormat:@&%@%@%@&,@& YEAR : &,md.YEAR,@&\n&];
NSData * data = [str dataUsingEncoding:NSUTF8StringEncoding];
[myFile createFileAtPath:SAVEPATH contents:data attributes:nil];
}最后几句中的SAVEPATH就是存储路径,需要带上文件格式的,就像你看一个文件的属性里面显示的那样,如:/user/Desktop/123.txt。
最后我们打开看看里面保存的是Xcode打印出来的形式也是一样的。我们也需在main加上一句代码,代码我就不写了。
最后上传一张图片关于使用苹果自带浏览器打开json文档乱码的问题是怎么解决的。
本文已收录于以下专栏:
相关文章推荐
网络数据解析框架  
1.  JsonModel   
一个 JSON 模型转换库,有着比较简洁的接口。Model 需要继承自 JSONModel。
2.  yyModel     
id json = [NSJSONSerialization JSONObjectWithData:[str dataUsingEncoding:NSUTF8StringEncoding] optio...
人生苦短,都说必须python,那么我分享下我是如何从小白成为Python资深开发者的吧。2014年我大学刚毕业..
第一种方法:用JSONKit库
1,首先在网上下载一个JSON库;
2,将库添加到工程;
3,代码如下
将JSON放入一个txt文件,放入NSString
NSString *jsons...
JSON串解析方法
作为一种轻量级的数据交换格式,json正在逐步取代xml,成为网络数据的通用格式。
有的json代码格式比较混乱,可以使用此“/”网站来进行JSON格式化校...
IOS JSON解析
通过使用NSJSONSerialization 可以Json与Foundation的相互转换。使用 JSONObjectWithData 可以将 Json 转化为 Foundation。使用 data...
他的最新文章
讲师: 许鹏
讲师:董付国
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)2014年5月 Web 开发大版内专家分月排行榜第二2014年4月 Web 开发大版内专家分月排行榜第二
2014年3月 Web 开发大版内专家分月排行榜第三2014年2月 Web 开发大版内专家分月排行榜第三2013年7月 .NET技术大版内专家分月排行榜第三2013年6月 .NET技术大版内专家分月排行榜第三2012年9月 .NET技术大版内专家分月排行榜第三
本帖子已过去太久远了,不再提供回复功能。

我要回帖

更多关于 objective c 数组长度 的文章

 

随机推荐