一.使用JSONKit的解析方法:(需导入包:#import
"JSONKit/JSONKit.h")
//如果json是“单层”的,即value都是字符串、数字,可以使objectFromJSONString
NSString *json1 = @"{\"a\":123, \"b\":\"abc\"}";
NSDictionary *data1 = [json1 objectFromJSONString];
[json1 release];
//如果json有嵌套,即value里有array、object,如果再使用objectFromJSONString,程序可能会报错(测试结果表明:使用由网络或得到的php/json_encode生成的json时会报错,但使用NSString定义的json字符串时,解析成功),最好使用objectFromJSONStringWithParseOptions:
NSString *json2 = @"{\"a\":123, \"b\":\"abc\", \"c\":[456, \"hello\"], \"d\":{\"name\":\"张三\", \"age\":\"32\"}}";
NSDictionary *data2 = [json2
objectFromJSONStringWithParseOptions:JKParseOptionLooseUnicode];
[json2 release];
二.使用SBJSON的解析方法:(需导入包:#import
"SBJson/SBJson.h")
bjson有一个有用的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 ivarelse.
if ([jsonObject isKindOfClass:[NSArray class]]) //treat as an array or reassign to an array ivar.
注:
转换代码: 如果直接使用NSMutableDictionary*root 来获得字符串,将会对json字串产生以下变化
1. 中文问题
2.加入了()符号
3.所有的: 变成了 =
要避免这个问题的产生,需要用
SBJsonWriter*jsonWriter = [[SBJsonWriteralloc]init];
NSString *jsonString = [jsonWriter stringWithObject:root];
[jsonWriter release];
这段代码来把 NSMutableDictionary 转成 NSString
缺点:性能差,解析速度慢,不建议使用。
三.使用TouchJSon解析方法:(需导入包:#import "TouchJson/JSON/CJSONDeserializer.h")
四.使用IOS5自带解析类NSJSONSerialization方法解析:(无需导入包,IOS5支持,低版本IOS不支持)
NSError *error;
//加载一个NSURL对象
NSURLRequest *request = [NSURLRequest
requestWithURL:[NSURL URLWithString:@"http://m.weather.com.cn/data/101180601.html"]];
//将请求的url数据放到NSData对象中
NSData *response = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
//IOS5自带解析类NSJSONSerialization从response中解析出数据放到字典中
NSDictionary *weatherDic = [NSJSONSerialization JSONObjectWithData:response options:NSJSONReadingMutableLeaves error:&error];
NSDictionary *weatherInfo = [weatherDic objectForKey:@"weatherinfo"];
txtView.text = [NSString stringWithFormat:@"今天是 %@ %@ %@ 的天气状况是:%@ %@ ",
[weatherInfo objectForKey:@"date_y"],
[weatherInfo objectForKey:@"week"],
[weatherInfo objectForKey:@"city"],
[weatherInfo objectForKey:@"weather1"],
[weatherInfo objectForKey:@"temp1"]];