如何解析从webservice返回的json
来源:互联网 发布:建设银行纸黄金软件 编辑:程序博客网 时间:2024/05/19 19:30
本文主要关注如何解析从webservice返回的json。
解析json我个人选择sbjson库。还有其他的如touchJSon和YAJL等选择,您可以自行下载决定(用哪个)。
让我们来对什么是json以及如何用他做一点简单的描述。
wikiw上说:
json(javascript Object Notation 的缩写)是一个基于文本的,人类可读的,开放标准的轻量级数据交换格式。它继承了javascript中的简单数据结构和相关数组对象,称为对象。不管它 和javascript的瓜葛,json是语言独立的,几乎所有编程语言都能解析它。
json以键值对来表示数据。每个值被一个键名字引用(键名字是个string)。如果你想以json表示人名,他们的名字将被"name"键引用,如下:
“name” : “James”
所以json用一种容易被应用程序传递的方式表现数据,非常完美。
所以当从webservice解析数据时,你要做的第一件事就是搞清楚你的模型。下面我们会分析webservice的响应数据,搞清楚哪些bit代表对象,对象数组,对象所属的字段,等等。
但是json可以表示哪些类型的数据呢?
1.对象是大括号内的所有东东
2.字符串用双引号
3.数字只是简单的显示,如 12345
4. 数组由中括号包围
5.布尔值从'true'和'false'获得,没有引号
6.null值由'null'表示,没有引号
下面的例子使用了所有这些数据类型:(显然并没有bool和null类型--译者按)
{
"firstName": "John",
"lastName": "Smith",
"age": 25,
"address":
{
"streetAddress": "21 2nd Street",
"city": "New York",
"state": "NY",
"postalCode": "10021"
},
"phoneNumber":
[
{ "type": "home", "number": "212 555-1234"},
{ "type": "fax", "number": "646 555-4567"}
]
}
以上数据的objective-c表示为:
#import <Foundation/Foundation.h>
@interface Person : NSObject
{
NSString *firstName;
NSString *lastName;
NSInteger age;
NSDictionary *address;
NSArray *phoneNumbers;
}
@end
你会认为我们漏掉了一些信息,比如地址的详情,以及电话号码。怎么建立你的对象模型是你决定的事情。
我选择了用字典保存地址详情,每个值用一个key名字引用,就像在json中一样。电话号码也保存在字典里,但是这些字典是放到数组中的。
如果你希望,你可以创建一个名为Adress的类,用它来保存地址详情。这会变得更像面向对象的方式,如果在app的其他地方还要用到address,并且不必绑定到person上的话会很有用。
一旦你有了自己的对象模型,你需要从json中得到数据并创建模型的实例。
sbjson有一个有用的sbjsonparser类,可以在一行内搞定整个json串的解析:
SBJsonParser *jsonParser = [[SBJsonParser alloc] init];
NSError *error = nil;
NSArray *jsonObjects = [jsonParser objectWithString:jsonString error:&error];
[jsonParser release], jsonParser = nil;
sbjson将json作为objective-c的字典来处理。对于不同的webservice,你可能得到一个顶级的json对象或者一个数组。因 此,objectWithString:error:有一个id类型返回值。你可以使用objective-c的动态特性来决定解析返回时采用何种数据来 接收,如下:
id jsonObject = [jsonParser objectWithString:jsonString error:&error];
if ([jsonObject isKindOfClass:[NSDictionary class]]) // treat as a dictionary, or reassign to a dictionary ivar else if ([jsonObject isKindOfClass:[NSArray class]]) // treat as an array or reassign to an array ivar.
如果webservice永远只返回两种顶层表现的一种,你大可以继续并假设它会是一个数组或字典,而不必担心检查(类型)。
现在你得到了以你可以通过objcetive-c管理的格式来表示json数据。你所要做的就是遍历数组/字典的内容,并创建person对象来表示他们。
一件值得记住的事情是,遍历如年龄这种数字将被包裹在NSNumber对象中,所以我们需要对其调用'intValue'来得到数字。
NSMutableArrary *people = [NSMutableArray array];
for (NSDictionary *dict in jsonObjects)
{
Person *newPerson = [[[Person alloc] init] autorelease];
[newPerson setFirstName:[dict objectForKey:@"firstName"]];
[newPerson setLastName:[dict objectForKey:@"lastName"]];
[newPerson setAge:[[dict objectForKey:@"age"] intValue]];
[newPerson setAddress:[dict objectForKey:@"address"]];
[newPerson setPhoneNumbers:[dict objectForKey:@"phoneNumber"]];
[people addObject:newPerson];
}
最终我们完成了。
解析json我个人选择sbjson库。还有其他的如touchJSon和YAJL等选择,您可以自行下载决定(用哪个)。
让我们来对什么是json以及如何用他做一点简单的描述。
wikiw上说:
json以键值对来表示数据。每个值被一个键名字引用(键名字是个string)。如果你想以json表示人名,他们的名字将被"name"键引用,如下:
“name” : “James”
所以json用一种容易被应用程序传递的方式表现数据,非常完美。
所以当从webservice解析数据时,你要做的第一件事就是搞清楚你的模型。下面我们会分析webservice的响应数据,搞清楚哪些bit代表对象,对象数组,对象所属的字段,等等。
但是json可以表示哪些类型的数据呢?
1.对象是大括号内的所有东东
2.字符串用双引号
3.数字只是简单的显示,如 12345
4. 数组由中括号包围
5.布尔值从'true'和'false'获得,没有引号
6.null值由'null'表示,没有引号
下面的例子使用了所有这些数据类型:(显然并没有bool和null类型--译者按)
{
"firstName": "John",
"lastName": "Smith",
"age": 25,
"address":
{
"streetAddress": "21 2nd Street",
"city": "New York",
"state": "NY",
"postalCode": "10021"
},
"phoneNumber":
[
{
{
]
}
以上数据的objective-c表示为:
#import <Foundation/Foundation.h>
@interface Person : NSObject
{
NSString *firstName;
NSString *lastName;
NSInteger age;
NSDictionary *address;
NSArray *phoneNumbers;
}
@end
你会认为我们漏掉了一些信息,比如地址的详情,以及电话号码。怎么建立你的对象模型是你决定的事情。
我选择了用字典保存地址详情,每个值用一个key名字引用,就像在json中一样。电话号码也保存在字典里,但是这些字典是放到数组中的。
如果你希望,你可以创建一个名为Adress的类,用它来保存地址详情。这会变得更像面向对象的方式,如果在app的其他地方还要用到address,并且不必绑定到person上的话会很有用。
一旦你有了自己的对象模型,你需要从json中得到数据并创建模型的实例。
sbjson有一个有用的sbjsonparser类,可以在一行内搞定整个json串的解析:
SBJsonParser *jsonParser = [[SBJsonParser alloc] init];
NSError *error = nil;
NSArray *jsonObjects = [jsonParser objectWithString:jsonString error:&error];
[jsonParser release], jsonParser = nil;
sbjson将json作为objective-c的字典来处理。对于不同的webservice,你可能得到一个顶级的json对象或者一个数组。因 此,objectWithString:error:有一个id类型返回值。你可以使用objective-c的动态特性来决定解析返回时采用何种数据来 接收,如下:
id jsonObject = [jsonParser objectWithString:jsonString error:&error];
if ([jsonObject isKindOfClass:[NSDictionary class]])
如果webservice永远只返回两种顶层表现的一种,你大可以继续并假设它会是一个数组或字典,而不必担心检查(类型)。
现在你得到了以你可以通过objcetive-c管理的格式来表示json数据。你所要做的就是遍历数组/字典的内容,并创建person对象来表示他们。
一件值得记住的事情是,遍历如年龄这种数字将被包裹在NSNumber对象中,所以我们需要对其调用'intValue'来得到数字。
NSMutableArrary *people = [NSMutableArray array];
for (NSDictionary *dict in jsonObjects)
{
Person *newPerson = [[[Person alloc] init] autorelease];
[newPerson setFirstName:[dict objectForKey:@"firstName"]];
[newPerson setLastName:[dict objectForKey:@"lastName"]];
[newPerson setAge:[[dict objectForKey:@"age"] intValue]];
[newPerson setAddress:[dict objectForKey:@"address"]];
[newPerson setPhoneNumbers:[dict objectForKey:@"phoneNumber"]];
[people addObject:newPerson];
}
最终我们完成了。
- 如何解析从webservice返回的json
- 如何通过jquery解析从服务器端返回的json数据
- 后台返回的json前端如何解析
- java 调用webservice 接口 解析返回json
- Android客户端解析服务器端WebService返回来的JSON数据(有源码,调试成功)
- asp通过json调用webservice接口,并获取返回的xml数据及解析
- ios webservice编程:soap封装调用,返回xml,json解析
- 用安卓自带的原生方法解析从webservice获取的json数据
- 用安卓自带的原生方法解析从webservice获取的json数据
- webservice返回json数据
- WebService 返回json格式和返回xml格式的数据
- vb 解析webservice返回的xml整理
- 如何访问发布的webservice,并解析返回的非正常soap报文
- C#windowForm 从php函数返回的Url获取到json并解析,下载文件
- android webservice通过soap协议返回XML,如何解析XML
- Javascript 解析 Servlet 返回的 JSON
- Android解析服务器返回的Json数据
- jquery 解析返回的xml和json
- CMOS定义及谈谈系统CMOS密码
- Python标准模块logging2
- ThinkPHP中的BUG及技巧与策:
- SQLSERVER数据分区
- android系统键盘隐藏与显示问题
- 如何解析从webservice返回的json
- ios代码行数统计
- 有关CMOS RAM的分析及读取
- SQL Server 2005 int与datetime数据类型的存储结构说明
- HTTP method GET is not supported by this URL 问题解决
- python 中两个list是否有相同元素的办法?
- dirent d_type类型
- C#多线程学习(一) 多线程的相关概念
- 页面跳转方法总结