作为一种轻量级的数据交换格式,json正在逐步取代xml,成为网络数据的通用格式。从ios5开 始,apple提供了对json的原生支持,但为了兼容以前的ios版本,我们仍然需要使用第三方库来解析常用的ios json库有json-framework、JSONKit、TouchJSON等。

AD:2013云计算架构师峰会超低价抢票中

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,目前在网络交互过程中有着举足轻重的地位如果您对json还有什么不清楚的话建议去看json百度百科

在iOS平台上,Apple 从 iOS 5.0 才开始提供原生的json生成和解析的API,使用起来 非常方便,但这样就无法为iOS 5.0 之前版本的用户服务了。对于iOS 5.0以前的系统,json的使用得益于无数无私的开源拥护者的贡献。估计大多数开发者现在还不会直接抛弃仍在使用 5.0 以前版本的用户,所以这里优先介绍3种主要的开源库的使用,然后再介绍新的原生API的使用。

测试数据我们使用国家气象局提供的天气预报接口:

您可以用浏览器打开,看看这三个地址到底是什么--其实你可以分别看到3个字符串,没错,你才对了,这就是我们测试用的 json 数据。

我们打开 github 搜索关键字 json ,程序语言选择 Objective-C ;可以得到 n 页结果。我们就依次介绍最前面的3个:stig/json-framework、TouchCode/TouchJSON、johnezang /JSONKit。紧接着介绍 iOS 5.0 开始提供的原生 JSON 处理类。

此处我们将这三个开源库及原生JSON处理类放到一个工程里介绍了,但开源库 stig/json-framework 编译是需要ARC支持的,而TouchCode/TouchJSON 和 johnezang/JSONKit 是不需要 ARC 支持。这样我么在工程中就需要打开 ARC (可以在创建工程的时候就选中 ARC,也可和下图一样在build setting 中设置两处 为 YES)

然后对后两者在编译规则中做简单的处理,-fno-objc-arc即是规定该文件编译时不需要ARC支持,如下图:

因为我们测试的数据来自于互联网,所以我们需要网络支持,这里我们需要添加系统库:CFNetwork.framework,如下图

终于开始写代码了,公用代码:

1.将url地址定义成字符串常量

2.import 相应文件;

3.连接到测试的url;

4.取得json数据,并将其以字符串的形式显示在第一个 TextView 上;

5.将解析后的JSON实际内容显示在第二个 TextView 上

  1. //为了方便,先在工程中的 .pch 文件中定义 字符串常量
  2. #define jsonSourceURLAddress_1 @"http://m.weather.com.cn/data/101010100.html"
  3. #define jsonSourceURLAddress_2 @"http://www.weather.com.cn/data/sk/101010100.html"
  4. #define jsonSourceURLAddress_3 @"http://www.weather.com.cn/data/cityinfo/101010100.html
  1. #import "LTRootViewController.h"
  2. //测试工程中 3 中方式都是在这个controller中使用,将需要的import进来
  3. #import "SBJson.h"
  4. #import "TouchJSON/JSON/CJSONDeserializer.h"
  5. #import "JSONKit/JSONKit.h"
  1. - (void)viewDidLoad
  2. {
  3. [super viewDidLoad];
  4. //向开源的地址发送连接请求
  5. //这里使用的是异步的请求
  6. NSURL *url = [NSURL URLWithString:jsonSourceURLAddress_1];
  7. NSURLRequest    *urlRequest = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestReturnCacheDataElseLoad timeoutInterval:30];
  8. NSURLConnection *urlConnection = [NSURLConnection connectionWithRequest:urlRequest delegate:self];
  9. [urlConnection start];
  10. }
  1. #pragma mark - NSURLConnectionDataDelegate methods
  2. - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
  3. {
  4. UIAlertView * alertV = [[UIAlertView alloc] initWithTitle:@"网络连接失败" message:[NSString  stringWithFormat:@"%@",error] delegate:self cancelButtonTitle:nil otherButtonTitles:nil, nil];
  5. [alertV show];
  6. }
  7. - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
  8. {
  9. //这里我们终于拿到了网络返回的 JSON 数据 data
  10. self.m_JsonData = data;
  11. self.m_sourceJsonTV.text = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
  12. }
  1. - (void)displayWithParsedDic:(NSDictionary *)rootDic
  2. {
  3. //rootDic 来自与我们所用的各种方式将 JSON 解析后得到的字典
  4. //下面用于在 TextView 中显示解析成功的JSON实际内容
  5. if (!rootDic) {
  6. self.m_parsedJsonTV.text = @"cleaned...";
  7. }else{
  8. NSDictionary *weatherInfo = [rootDic objectForKey:@"weatherinfo"];
  9. //由于字典中内容太多,我们只显示了一部分,诸如 temp2,temp3,...我们木有在这一一显示
  10. self.m_parsedJsonTV.text = [NSString stringWithFormat:@"今天是 %@  %@  %@  的天气状况是:%@  %@ ",[weatherInfo objectForKey:@"date_y"],[weatherInfo objectForKey:@"week"],[weatherInfo objectForKey:@"city"], [weatherInfo objectForKey:@"weather1"], [weatherInfo objectForKey:@"temp1"]];
  11. }
  12. }

现在分类的介绍这4种JSON解析方式:

1、json-framework

也有人管这库叫SBJson我们从 github 上下载 json-framework这个库并将其导入到我们的工程中(仅需将下载下来的文件夹中,classes 目录下的所有文件复制导入到我们的工程就行)。在任何你需要使用json处 :#import "SBJson.h"

  1. - (IBAction)sbjsonAction:(id)sender {
  2. //此处是使用 json-framework (SBJSON)解析,得到解析后存入字典:rootDic,并显示
  3. SBJsonParser * parser = [[SBJsonParser alloc] init];
  4. NSString * jsonStr = [[NSString alloc] initWithData:self.m_JsonData encoding:NSUTF8StringEncoding];
  5. NSDictionary *rootDic = [parser objectWithString:jsonStr];
  6. [self displayWithParsedDic:rootDic];
  7. }

2、TouchJSON

我纠结了很久,要不要介绍这个库了,因为作者在github上声称:"But you should NOT be using this code in your new projects"。

我们从 github 上下载TouchCode/TouchJSON 这个库并将其导入到我们的工程中(仅需将下载下来的文件夹中,Source 目录下的所有文件复制导入到我们的工程)。但是 Source/Experimental目录下提供的功能慎用( Be aware that the code in the Experimental subdirectory of Source is just that and may not have been extensively tested and/or have extra dependencies)。在任何你需要使用json处:#import "CJSONDeserializer.h"

  1. - (IBAction)touchJsonAction:(id)sender {
  2. //此处是使用 TouchJSON 解析,得到解析后存入字典:rootDic,并显示
  3. NSError * error = nil;//error 用来存储解析过程中可能出现的错误信息
  4. NSDictionary *rootDic = [[CJSONDeserializer deserializer] deserialize:self.m_JsonData error:&error];
  5. [self displayWithParsedDic:rootDic];
  6. }

3、JSONKit

我们从 github 上下载johnezang/JSONKit 这个库并将其导入到我们的工程中(这个很简单,代码文件只有2个,都复制导入我们的工程吧)。

  1. - (IBAction)jsonkitAction:(id)sender {
  2. //此处是使用 JSONKit 解析,得到解析后存入字典:rootDic,并显示
  3. NSDictionary * rootDic = [self.m_JsonData objectFromJSONDataWithParseOptions:JKParseOptionLooseUnicode];
  4. [self displayWithParsedDic:rootDic];
  5. }

4、原生JSON处理类

使用原生的JSON处理类解析就相当方便了,据说也是最快的(未亲测速度):

  1. - (IBAction)nsjsonAction:(id)sender {
  2. //此处是使用原生的 JSON 处理类解析,得到解析后存入字典:rootDic,并显示
  3. NSError *error = nil;
  4. NSDictionary * rootDic = [NSJSONSerialization JSONObjectWithData:self.m_JsonData options:NSJSONReadingMutableLeaves error:&error];
  5. [self displayWithParsedDic:rootDic];
  6. }

小结:这里只是介绍了最简单的通过网络得到JSON并解析之的方法。在实际应用中我们可能还要主意在解析时,根据实际传输的数据需要设置的 option 类型。由于本人的水平有限,如果有错我还请各位拍砖,并点出来我一定第一时间更正。

iOS网络交互数据格式解析之json的更多相关文章

  1. Android数据格式解析对象JSON用法

    1.JSON概念: 一种轻量级的数据交换格式,具有良好的可读和便于快速编写的特性,从而可以在不同平台间进行数据交换.JSON采用兼容性很高的文本格式,同时也具备类似于C语言体系的行为. JSON可以将 ...

  2. ios网络_json数据解析

    网络上数据传输以json或者xml格式. json是字典 或者 数组 或者字典跟数组嵌套的形式.解析json就是把json反序列化(解析)---把json转换为oc对象.json序列化就是把oc对象转 ...

  3. iOS网络-02-数据解析(JSON与XML)

    数据交互格式 服务器返回给用户的数据,通常是以下两种方式: JSON XML JSON 一种轻量级的数据数据格式,体积比XML小,是服务器返回给移动端通常采用的格式 用使用JSON文件中的数据,需要对 ...

  4. IOS 网络浅析-(七 JSON解析之三方JSONKit)

    在这个网络横行的时代......... 有没有小说的感觉,哈哈

  5. Android数据格式解析对象JSON用法(转)

    地址:http://www.cnblogs.com/devinzhang/archive/2012/01/09/2317315.html 里面的重点: JSON解析案例     (1)解析Object ...

  6. IOS网络第二天 - 07-发送JSON给服务器

    *************** #import "HMViewController.h" #import "MBProgressHUD+MJ.h" @inter ...

  7. ios 网络数据下载和JSON解析

    ios 网络数据下载和JSON解析 简介 在本文中笔者将要给大家介绍ios中如何利用NSURLConnection从网络上下载数据,如何解析下载下来的JSON数据格式,以及如何显示数据和图片的异步下载 ...

  8. 浅议iOS网络数据解析

    /*------------------------------------ 数据解析: 1.JSON数据 --------------------------------*/ 重点:1.什么是JSO ...

  9. [iOS 多线程 & 网络 - 2.3] - 解析xml

    A.XML基本知识 1.xml概念 什么是XML全称是Extensible Markup Language,译作“可扩展标记语言”跟JSON一样,也是常用的一种用于交互的数据格式一般也叫XML文档(X ...

随机推荐

  1. centos使用--vsftpd配置

    目录 1 在服务器配置FTP服务 1.1 在root权限下,通过如下命令安装Vsftp(以CentOS系统为例): 1.2 在启动vsftpd服务之前,需要登录云服务器修改配置文件,禁用匿名登录. 1 ...

  2. php和js中数组的总结

      php中数组的表示方法:array()或者[] js中数组的表示方法:new array()或者[] 一.php中初始化命名数组 在PHP中声明数组的方式主要有两种:一是应用array()函数声明 ...

  3. Python Flask构建可拓展的RESTful API

    1-1 Flask VS Django 1-2  课程更新维护说明: 1-3 环境.开发环境与Flask: 1.3.1 关注版本更新说明: 1-4 初始化项目:

  4. 聊聊、SpringBoot 静态资源访问

    SpringBoot 1.X 版本和 SpringBoot 2.X 版本在静态资源访问上有一些区别,如果直接从 1.X 升级到 2.X 肯定是有问题的.这篇文章就来讲讲这方面问题,也是项目中的坑. 先 ...

  5. 聊聊、CA机构认证CSR生成

    https://search.thawte.com/support/ssl-digital-certificates/index?page=content&id=SO832 https://s ...

  6. NodeJs爬虫抓取古代典籍,共计16000个页面心得体会总结及项目分享

    项目技术细节 项目大量用到了 ES7 的async 函数, 更直观的反应程序了的流程.为了方便,在对数据遍历的过程中直接使用了著名的async这个库,所以不可避免的还是用到了回调promise ,因为 ...

  7. 深入学习之mysql(二)表的操作

    1.表:是数据库中的存储数据的基本单位,一个表包含若干个字段和值 2.创建表: CREATE TABLE 表名称 ( 字段名1 数据库类型1 [约束条件1], 字段名2 数据库类型2 [约束条件2], ...

  8. Unity3D_异步加载场景(进度条)

    创建两个场景:现在的场景“NowScene”,要加载的场景“LoadScene”: “NowScene”如图所示,“LoadScene”任意: 创建脚本“AsyncLoadScene”,复制如下代码, ...

  9. Pointcut is not well-formed: expecting 'identifier' at character position 0 ^ || Pointcut is not well-formed: expecting ')' at character position 11 ^

    错误提示: 解决方法1:指定execution 在执行目标方法之前指定execution 解决方法2:可能是execution写错了.请仔细检查. 其他——execution参数设置(带问好的可以不配 ...

  10. log4j.xml配置文件详解

    一 log4j.xml 配置 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE log4j:c ...