原文地址:
http://blog.163.com/alex_kame/bl ... 748201162651214195/ 译文: 本文主要关注如何解析从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]; } 最终我们完成了。 最后需要注意的一点是,你可能注意到我在创建Person对象时使用了文本字符串。更好的方式是,你为每个key名字使用和创建一个字符串常量,这样你能更好的决定每个key名字。这样,当你在解析你的数据时,你不小心敲错了firstName,编译器就会抛出错误(因为它不符合你创建常量的名字),并能节省你大量的调试时间,仅仅是因为某种该死的原因,你不能从@"firtName"得到任何数据。 原文链接:https://www.f2er.com/json/290621.html