将JSON字符串转换为NSDictionary

时间:2013-05-05 09:10:02

标签: objective-c json nsdictionary

我正在尝试构建一个应用程序,人们可以从不同的商店订购商品。我对编程很陌生,我认为建立这样的项目是学习它的好方法。

我被困在我的应用程序中,用户可以在我的数据库中搜索公司(公司名称,位置或两者)。数据库返回一个JSON字符串,其中包含所有找到的公司的公司名称和位置,如下所示:

{"companyName":"testcompany_1","companyCity":"Tiel"},  
{"companyName":"tectcompany_2","companyCity":"Tiel"}

到目前为止一切顺利!

现在我想将此JSON字符串(NSString)转换为NSDictionary,以便在tableView中显示找到的公司的名称和位置。这就是我被卡住的地方。

我一直在搜索StackOverflow,google等等,我尝试了几种方法来做到这一点,例如:

由于没有看到任何教程/答案真正解决了我的问题,我试图自己制作一些东西,这就是结果:

NSString *strURL = [NSString stringWithFormat:@"http://www.imagine-app.nl/companySearch.php?companyNameSearchField=%@&companyCitySearchField=%@", companyNameSearchField.text, companyCitySearchField.text];
NSData *dataURL = [NSData dataWithContentsOfURL:[NSURL URLWithString:strURL]];
strResult = [[NSString alloc] initWithData:dataURL encoding:NSUTF8StringEncoding];
NSArray *companies = [inputString componentsSeparatedByString:@"},{"];
NSDictionary *dictionary = [NSJSONSerialization JSONObjectWithData:[NSData dataWithContentsOfFile:companies] options:kNilOptions error:nil];

对我而言,这是有道理的。首先,将NSString转换为NSArray以分隔对象,然后将字符串转换为NSDictionarytableview可以使用null来填充这个。 但是当我记录字典时,它会显示NSDictionary,因此此代码似乎没有json string

经过几周的尝试和搜索,我开始感到非常愚蠢和绝望,因为我找不到一个好方法来做到这一点。

是否有人知道如上图所示将NSDictionary变为{{1}}?

2 个答案:

答案 0 :(得分:2)

您想要做的是以下内容:

NSURL *anURL = [NSURL URLWithString:[NSString stringWithFormat:@"http://www.imagine-app.nl/companySearch.php?companyNameSearchField=%@&companyCitySearchField=%@", companyNameSearchField.text, companyCitySearchField.text]];
NSData *jsonData = [NSData dataWithContentsOfURL:anURL];
NSArray *mainArray = [NSJSONSerialization JSONObjectWithData:jsonData options:kNilOptions error:NULL];
// In mainArray are NSDictionaries
for (NSDictionary *informationOnOneCompany in mainArray) {
    NSString *name = informationOnOneCompany[@"companyName"];
    NSString *city = informationOnOneCompany[@"companyCity"];
    // Now you can store these two strings in that array or whatever populates your tableview ;)
}

让我们看看步骤:

  1. 我们使用我们想要的链接创建一个NSURL实例。
  2. 我们将该链接的内容下载到NSData对象。
  3. 我们知道我们收到的JSON是怎样的,并确定“顶层”是一个数组。因此,我们创建了一个NSArray并使用我们收到的JSON对其进行初始化。
  4. 您发布的JSON中的花括号和冒号告诉我们,我们创建的数组是NSDictionary的实例。
  5. 我们使用fast enumeration
  6. 遍历NSArray
  7. 在每个NSDictionary中,我们会查看“companyName”和“companyCity”键,并将其值存储在NSString中。
  8. 未在上述代码中实现:您可以填充NSArray datasource tableView
  9. 希望有帮助,如果您有任何疑问,请告诉我;)

答案 1 :(得分:1)

不,在几个地方根本没有意义。例如:

[NSData dataWithContentsOfFile:companies]
嗯,什么? companies是包含NSArray的{​​{1}} - 它不是指向您可以使用初始化数据对象的文件的文件路径。

(看起来你正在假设各个方法的作用 - 为什么呢?最好阅读文档 - 你不会浪费你和我们的时间。)

您在问题中提供的文字/数据也不是有效的JSON。我唯一可以想象的是,Web服务确实返回了有效的JSON,i。即逗号分隔的词典正确地包装在NSString之间以形成一个数组,你只是忘了包含它们。在这种情况下,你不必强奸字符串和糟糕的Foundation框架,只需将JSON转换为数组就可以了:

[ ]