从 JSON iOS 中提取值

Posted

技术标签:

【中文标题】从 JSON iOS 中提取值【英文标题】:Extracting values from JSON iOS 【发布时间】:2014-11-04 14:25:41 【问题描述】:

我正在开发一个与我自己的服务器 (Apache->php) 通信的应用程序,并且我正在向应用程序发送一个带有 PHP 代码的简单 JSON 字典:

$aJSON = array('Result' => TRUE, 'Result_Msg' => "Success!!!");
echo json_encode($aJSON);

通过这些代码行,我想从键中提取值:'Result' 和 'Result_Msg':

// Logging the received and converted JSON/NSMutableDictionary
NSLog(@"responseDict=%@",dJSON);

BOOL b = [dJSON objectForKey:@"Response"];
NSString *string = [dJSON objectForKey:@"Result_Msg"];

NSLog(@"%@", [dJSON objectForKey:@"Response_Msg"]);
NSLog(@"%@", [dJSON valueForKey:@"Response_Msg"]);
NSLog(@"%@", [dJSON valueForKey:@"Response"]);
NSLog(@"%@", [dJSON objectForKey:@"Response"]);

我打印/记录的 JSON 结果如下所示:

responseDict = 结果 = 1; "Result_Msg" = "用户添加成功,请验证您的邮件地址。";

不幸的是,每个 NSLog 以及变量“b”和“string”都等于(null)。

此外,我对两种不同类型的键有点困惑,比如 Result 没有引号 ("") 但 Result_Msg 是在引号中。

希望有人可以提供帮助。提前致谢!

编辑:

变量“dJSON”已经是一个 NSDictionary (/MutableDic)。我用这些行来做这个:

NSError *errorJson=nil;
    NSMutableDictionary* dJSON = [NSJSONSerialization JSONObjectWithData:_responseData options:kNilOptions error:&errorJson];
if (error)

    UIAlertView *alert ....
    return;

// --- 分析和提取值 --- //

【问题讨论】:

这真的是由 PHP:json_encode() 生成的 JSON 吗?由于 PHP 的 JSON 要求所有键和值都封装在引号中。另外,仅此一个“;”最后是腥的。无论如何,作为第一步,尝试将您的 JSON 编辑为以下格式:"Result"="1";"Result_Msg"="foo" 感谢您的回答,但我像您所说的那样更改了 PHP 代码,但在客户端我得到了与以前相同的响应: responseDict= Result = 1; "Result_Msg" = "成功!!!"; 那么有什么东西正在破坏你的 JSON 字符串。很抱歉我不能再帮你了,因为 Objective-c 不是我的领域。 我解决了,但感谢您的帮助! 【参考方案1】:

有两种简单的方法可以从 PHP 代码中检索字典。

首先,您不必在 Objective-C 代码中更改对服务器的调用,即使用此函数:

- (NSDictionary *)dictionaryFromJSONData:(NSData *)data

    NSError *error;
    NSDictionary *dictionaryParsed = [NSJSONSerialization JSONObjectWithData:data
                                                                 options:0
                                                                   error:&error];
    if (!dictionaryParsed)
    
        if (error)
        
            NSLog(@"Error parsing dictionary");
        
        return nil;
    
    return dictionaryParsed;

第二个是使用AFNetworking 库,顺便说一下,它提供了很多有用的东西。 (在你的情况下查看AFHTTPRequestOperation

编辑

然后,您可以使用以下命令检索布尔值:

BOOL myBool = [[myDictionary valueForKey:@"myKey"] boolValue];

还有你的字符串:

NSString *myString = [myDictionary objectForKey:@"myKey"];

【讨论】:

对不起,我之前忘记提了..当然我之前做过转换。所以变量“dJSON”已经是一个NSDictionary了! 在代码中的这些行添加断点时,您是否在字典中看到正确的值? 是的,有常见的键/值对,例如 key:Result value:1;键:Result_Msg 值:成功!!! 试试我在帖子中所做的编辑。您不应该使用 %@ 对 bool 进行 NSLog,但字符串看起来很奇怪...此外,打印结果时没有 ",因为它是一个没有任何空格的字符串【参考方案2】:

我解决了... 这就像我犯过的最愚蠢和最耗时的错误......我使用了错误的键来从字典中提取值!!!不是 Response_Msg 和 Response,而是 Result 和 Result_Msg.... 只是乍一看是一样的。

谢谢大家!

【讨论】:

以上是关于从 JSON iOS 中提取值的主要内容,如果未能解决你的问题,请参考以下文章

如何从PostgreSQL json中提取数组

Jmeter之Json提取器详解(史上最全)

Jmeter之Json提取器详解(史上最全)

c#如何读取json中的值

如何从 iOS 中的字典中获取值

从日志条目中的 json 中提取 json 值