问题描述
|
我已经通过使用下面的代码将一些MysqL数据反馈给应用程序,当然不是所有的东西都存在,只有需要的东西。尽管已成功从我的PHP文件返回了JSON,但我似乎无法抓住\'cash \'的值。我正在使用Touch JSON。
请帮忙?
Nsstring *urlString = [Nsstring stringWithFormat:@\"http://REMOVED/REMOVED.PHP?login_key=%@&username=%@\",login_key,username];
Nsstring *strResponse = [self stringWithUrl:[NSURL URLWithString:urlString]];
NSLog(@\"%@\",strResponse);
NSData *jsonData = [strResponse dataUsingEncoding:NSUTF8StringEncoding];
NSError *error = nil;
NSDictionary *dictionary = [[CJSONDeserializer deserializer] deserializeAsDictionary:jsonData error:&error];
NSLog(@\"Cash: %@\",[dictionary objectForKey:@\"cash\"]);
这将返回以下日志:
2011-05-29 10:10:35.493 test1[623:207] [[[{\"uid\":\"0\",\"username\":\"admin\",\"password\":\"REMOVED\",\"email\":\"REMOVED\",\"cash\":\"925071\",\"exp\":\"117500\",\"level\":\"1\",\"clan\":\"YES\",\"clanid\":\"1\"}]]]
2011-05-29 10:10:35.495 test1[623:207] Cash: (null)
解决方法
您的JSON数据包含一个数组作为顶级对象,因此您不能将其反序列化为字典:
[
[
[
{
\"cash\" : \"925071\",\"clan\" : \"YES\",\"clanid\" : \"1\",\"email\" : \"REMOVED\",\"exp\" : \"117500\",\"level\" : \"1\",\"password\" : \"REMOVED\",\"uid\" : \"0\",\"username\" : \"admin\"
}
]
]
]
尝试以下方法:
NSArray *array = [[CJSONDeserializer deserializer] deserializeAsArray:jsonData
error:&error];
另外,请注意,JSON数据中有三个数组,只有最里面的数组包含一个对象(一个字典)。目前尚不清楚为什么有三个嵌套数组,以及数组中的其他元素是什么,因此很难为您的问题提供通用的解析解决方案。一种可能性是:
for (NSArray *innerArray2 in array) {
for (NSArray *innerArray3 in innerArray2) {
for (NSDictionary *dictionary in innerArray3) {
NSString *cash = [dictionary objectForKey:@\"cash\"];
NSLog(@\"Cash = %@\",cash);
}
}
}
, 检查您的字典是否为空!
一个简单的方法是:
if(!dictionary)NSLog(@\"dictionary is nil!\");
, 我会检查两件事:
您的json正确产生
您指定的编码是正确的编码。
具体来说,我会尝试使用NSASCIIStringEncoding而不是NSUTF8StringEncoding(我建议这样做仅是因为据我所知,这通常是问题的原因)