如何从 iOS 中的字典中获取值
Posted
技术标签:
【中文标题】如何从 iOS 中的字典中获取值【英文标题】:How to get values from a dictionary in iOS 【发布时间】:2013-11-14 05:14:06 【问题描述】:我是 ios 的新手。我创建了一个登录页面,一切正常。我使用 JSON 来检查用户名和密码,并以 dictionary 格式从服务器获得响应。我想从 dictionary 中提取值并在我的程序中检查它们。 我从服务器得到的响应是:
json:
error = 0;
msg = "";
value =
user = false;
;
;
首先我想检查键 error
的值是 0
还是 1
。然后我想用 user
键检查值。我不知道我应该如何编码来检查它。有人可以帮忙吗?
我尝试的代码如下:
- (void)connectionDidFinishLoading:(NSURLConnection *)connection
NSString *respString = [[NSString alloc] initWithData:loginJSONData encoding:NSUTF8StringEncoding];
SBJsonParser *objSBJSONParser = [[SBJsonParser alloc] init];
NSDictionary *json = [[NSDictionary alloc] initWithDictionary:[objSBJsonParser objectWithString:respString]];
NSLog(@"json: %@",json);
NSString *error = [json objectForKey:@"error"];
NSLog(@"error: %@", error);
if ([error isEqualToString:@"o"])
NSLog(@"login successful");
else
NSLog(@"login fail");
【问题讨论】:
你看过NSDictionary
的文档吗?
是的,我尝试使用 NSDictionary 以及如何以编程方式获取值“false”
发布您尝试过的代码(通过更新您的问题),以便人们可以提供帮助。
我试过的代码是:
***.com/questions/10368303/…检查一下
【参考方案1】:
使用现代 Objective-C,访问数组和字典中的内容变得更加容易。
您应该使用以下语法:
id<NSObject> value = dictionary[@"key"];
同样,
id<NSObject> value = array[1]; // 1 is the index
将上述应用于问题:
NSString *error = json[@"error"];
NSDictionary *value = json[@"value"];
BOOL user = [json[@"value"][@"user"] boolValue];
如上一行,嵌套是允许的,但这不是一个好习惯。
【讨论】:
我尝试了上面的代码,但它抛出了异常。你能告诉如何为用户编写代码以获取值“true”或“false”。 所以第一段json[@"value]
返回我们包含用户属性的 NSDictionaryObject 然后访问 json[@"value"][@"user"]
将返回布尔值作为 NSNumber 对象(至少我认为)然后调用 BoolValue
将转换为 BOOL... 我怀疑当我们尝试调用 boolValue
时发生异常,您能粘贴异常吗?
[__NSDictionaryM boolValue]:无法识别的选择器发送到实例 0x756a050 *** 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“-[__NSDictionaryM boolValue]:无法识别的选择器发送到实例 0x756a050”libc+ +abi.dylib: 终止调用抛出异常
单独尝试这些,看看单个调用是否有效;试试json[@"value"][@"user"]
看看对象是什么类型。【参考方案2】:
NSNumber *error = [json objectForKey:@"error"];
if ([error intValue] == 0)
NSLog(@"login successful");
NSDictionary *value = [json objectForKey:@"value"];
NSNumber *user = [value objectForKey:@"user"];
if ([user boolValue])
NSLog(@"user == true");
else
NSLog(@"user == false");
else
NSLog(@"login failed");
【讨论】:
user
的代码不正确。 json
没有 user
密钥。
移动代码以使用户进入if
语句的“then”部分,您就有了正确的答案。
@rmaddy 我不知道他想在哪里编写代码来检查user
的值,但在if
内部是最合适的。感谢您的建议
我提出这个建议是因为我认为 OP 是这么说的,但在再次阅读后我发现它并不清楚。但是如果没有错误,只检查用户是有意义的。
是的,有道理。【参考方案3】:
通常从服务器返回的字典将作为键值对。如果您正在寻找访问与键对应的这些值,那么这些代码可能会对您有所帮助
NSString *varname = [[NSString alloc]initWithFormat:@"%@",[dictionaryname objectForKey:@"key"]];
【讨论】:
【参考方案4】:用于从您的 JSON
字典中获取 error 值。
NSString *error = [myJSONDicName objectForKey:@"error"];
用于从您的 JSON
字典中获取 user 值。
NSString *error = [[myJSONDicName objectForKey:@"value"] objectForKey:@"user"];
已编辑:
你只需要改变你的
if ([error isEqualToString:@"o"])
_^_
|
将'o'
更改为'0'
【讨论】:
是的,OP 可以。但是OP是不正确的。这就是 OP 的代码不起作用的原因之一。 @rmaddy - 但在 OP 的情况下.. 他/她只需要检查错误是0
或 1
然后我认为 isEqualToString
是工作。
但是代码会因为NSNumber
没有isEqualToString:
方法而崩溃。
@rmaddy - NSNumber
???抱歉,OP 将其作为 NSString 得到,因此不需要使用 NSNumber
..
正如我所说,OP 是错误的。看看 JSON。 0
不在引号中,不是NSString
。【参考方案5】:
你可以使用下面的代码
-(void)connectionDidFinishLoading:(NSURLConnection *)connection
NSString *respstring = [[NSString alloc]initWithData:loginJsonData encoding:NSUTF8StringEncoding];
NSDictionary *dic = [responseString JSONValue];
NSLog(@"%@",dic);
NSNumber *error = [dic objectForKey:@"error"];
if([error intValue] == 0)
NSLog(@"login successful");
else
NSLog(@"login fail");
NSString *user = [value objectForKey:@"user"];
BOOL userStatus = [user boolValue];
【讨论】:
OP 已经有从 JSON 中获取字典的代码。这不是问题。 它仍然没有回答问题。继续前进。以上是关于如何从 iOS 中的字典中获取值的主要内容,如果未能解决你的问题,请参考以下文章