【问题标题】:How to get values from a dictionary in iOS如何从 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”
  • 发布您尝试过的代码(通过更新您的问题),以便人们可以提供帮助。
  • 我试过的代码是:

标签: ios objective-c json nsdictionary


【解决方案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 的情况下.. 他/她只需要检查错误是 01 然后我认为 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 中获取字典的代码。这不是问题。
    • 它仍然没有回答问题。继续前进。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多