如何解析從webservice返回的json

本文主要關注如何解析從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];
}

最終我們完成了。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章