如何解析从webservice返回的json

时间:2021.08.20 发布人:anoi333692

如何解析从webservice返回的json

已解决问题

谷歌anoi333692用户在2021.08.20提交了关于“我的大叔如何解析从webservice返回的json”的提问,欢迎大家涌跃发表自己的观点。目前共有1个回答,最后更新于2025-02-27T21:27:08。希望大家能够帮助她。

详细问题描述及疑问:期待您的答案,谢谢你帮我,祝你快乐,愿你事事如意 !

希望以下的回答,能够帮助你。

第1个回答

用户名:匿名用户  

如何解析从webservice返回的json。

解析json我个人选择sbjson库。还有其他的如touchJSon和YAJL等选择,您可以自行下载决定(用哪个)。

让我们来对什么是专处守json以及如何用他做一点简单的描述。

wikiw上说:

json(j**ascriptObjectNotation的缩写)是一个基于文本的,人类可读的,**标准的轻量级**交换格式。它继承了j**ascript中的简单**结构和相关数国表矿径从乱组对象,称为对象。判害委章满易二后不管它和j**ascript的瓜葛,json是语言独立的,几乎所有编程语言都能解析它。

json以键衷月怕整示重古联速高神来表示**。每个值被一个键名字引用(键名字是个string)。如果你想以json表示人名,他们的名字将被"name"键引用,如下:

“name”:“J问答ames”

所以json用一种容易被应用程序传递的方式表现**,非常完美。

所以当从webservi车办升更ce解析**时,你要做的第一件事就是搞清楚你的模型。下面我们会分析webservice的响应**,搞清楚哪些bit代表对象,对象数组,对象所属的字段,等等。

但是json可以表示哪刑整氧接吃黑些类型的**呢?

1.对象担具是大括号内的所有东东

2.字符串用双引号

3.数字只是简单的显示,如12345

4.数组由中括号包围

5.布尔值从'true'和'false'获得,没有引号

6.**ll值由'**ll'表示,没有引号

下面的例子使用了所有这些**类型:(显然并没有bool和**ll类型--译者按)

{

"firstName":"John",

"la称团倍加市有杂州方stName":"Smith",

"age":25,

"address":

{

"s三道先跳投界treetAddr水刻春接才独冲向比ess":"212ndStr镇eet",

"city":导又听轻些候思"NewYork",

"s全凯都皮识推经tate":"NY",

"postalCode":"10021"

},

"每带儿念作史南川phoneNumber怕图空数概培雷":

[

{"type":"h章把搞ome","**mb移应剂蒸查并明er":"212555-1234"},

{"type":"fax","**mber":"646555-4567"}

]

}

以上数据的objective-c表示为:

#import

@interfacePerson:NSObject

{

NSString*firstNam伤识民护投适你e;

NSString*lastName;

NSIntegerage;

NSDictionary*address;

NSArray*phoneNumbers;

}

@end

你会认为我们漏掉了一些信息,比如地址的详情,以及电话号码。怎么建立你的对象模型是你决定的事情。

我选择了用字典保存地址详情,每个值用一个key名字引用,就像在json中一样。电话号码也保存在字典里,但是这些字典是放到数组中的。

如果你希望,你可以创建一个名为Adress的类,用它来保存地址详情。这会变得更像面向对象的方式,如果在app的其他地方还要用到address,并且不必绑定到person上的话会很有用。

一旦你有了自己的对象模型,你需要从json中得到**并创建模型的实例。

sbjson有一个有用的sbjsonparser类,可以在一行内搞定整个json串的解析:

SBJsonParser*jsonParser=[[SBJsonParseralloc]init];

N**rror*error=nil;

NSArray*jsonObjects=[jsonParserobjectWithString:jsonStringerror:&error];

[jsonParserrelease],jsonParser=nil;

sbjson将json作为objective-c的字典来处理。对于不同的webservice,你可能得到一个顶级的json对象或者一个数组。因此,objectWithString:error:有一个id类型返回值。你可以使用objective-c的动态特性来决定解析返回时采用何种**来接收,如下:

idjsonObject=[jsonParserobjectWithString:jsonStringerror:&error];

if([jsonObjectisKindOfClass:[NSDictionaryclass]])//treatasadictionary,orreassigntoadictionaryivarelseif([jsonObjectisKindOfClass:[NSArrayclass]])//treatasanarrayorreassigntoanarrayivar.

如果webservice永远只返回两种顶层表现的一种,你大可以继续并假设它会是一个数组或字典,而不必担心检查(类型)。

现在你得到了以你可以通过objcetive-c管理的格式来表示json**。你所要做的就是遍历数组/字典的内容,并创建person对象来表示他们。

一件值得记住的事情是,遍历如年龄这种数字将被包裹在NSNumber对象中,所以我们需要对其调用'intValue'来得到数字。

NSMutableArrary*people=[NSMutableArrayarray];

for(NSDictionary*dictinjsonObjects)

{

Person*newPerson=[[[Personalloc]init]autorelease];

[newPersonsetFirstName:[dictobjectForKey:@"firstName"]];

[newPersonsetLastName:[dictobjectForKey:@"lastName"]];

[newPersonsetAge:[[dictobjectForKey:@"age"]intValue]];

[newPersonsetAddress:[dictobjectForKey:@"address"]];

[newPersonsetPhoneNumbers:[dictobjectForKey:@"phoneNumber"]];

[peopleaddObject:newPerson];

}

最终我们完成了。