如何搜索 JSON 文件? [关闭]

Posted

技术标签:

【中文标题】如何搜索 JSON 文件? [关闭]【英文标题】:How to search JSON files? [closed] 【发布时间】:2013-10-22 11:19:48 【问题描述】:

我正在编写一个以 JSON 格式读取其数据的应用程序。它应该是一个分类广告应用程序。例如,它从单独的 JSON 文件中获取类别列表、子类别和每个广告。现在我想添加一个搜索选项。问题是我不知道是否可以搜索 JSON 文件以及它是否有效。有人有更好的方法吗?

【问题讨论】:

看看这里***.com/questions/777455/… 您可以将文档加载到 NSArray 中,然后 filterUsingPredicate : [NSPredicate predicateWithBlock^: ... ] @kgu87 是的,这是我首先想到的。但是让我在主页上说我想搜索 2008 年的宝马。因此应用程序必须开始将每个类别的详细信息解析为数组或字典,然后进行搜索。那肯定会导致内存不足! 听起来您正在尝试建立一个广告信息数据库。在这种情况下,并且无法访问在线广告数据库,您将不得不下载所有 JSON 文件并根据该信息构建一个数据库(sqlite 或 Core Data 或其他),然后将其存储在设备上。这对我来说听起来不是一个好主意。 您不必预先加载文件的内容。您可以获取文件名,然后在谓词中一一检查。 【参考方案1】:

如果您想避免使用数据库,那么您只有几个选择。将它们加载到内存中(预先或延迟)。这样做的好处是以内存占用(空间与时间)为代价使其更快。但是在您的cmets中,您说这会占用大量内存。另一种选择是每次加载和卸载每个 JSON 文档。但是,如果您担心由于文档数量而导致的内存占用,那么这可能会太慢。有一种变体,您可以创建自己的本地索引,但此时,您将开始创建自己的数据库。

所以,最后,听起来您正在努力避免使用数据库。

考虑 CoreData 或 SqlLite。

如果您想使用简单的 JSON 文档,还可以考虑 EJDB,它是基于嵌入式 JSON 文档的文档数据库(如 MongoDb)。还有一个称为 EJDBKit 的 objective-c wrapper for EJDB。

它旨在成为一个快速的类似 MongoDB 的库,可以嵌入到 下的 C/C++、.Net、NodeJS、Python、Lua、Go、Java 和 Ruby 应用程序 LGPL 许可条款。

EJDB 是基于 Tokyo Cabinet 修改版的 C 库。

使用基于 API 的 API 实现的查询和数据的 JSON 表示 C BSON

【讨论】:

【参考方案2】:

要从JSON 文件中搜索,首先需要对其进行解析。

按照以下步骤操作:

NSData *theData = [NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"fileName"ofType:@"json"]];
NSDictionary *myJSONData = [NSJSONSerialization JSONObjectWithData:theData options:NSJSONReadingMutableContainers error:nil];

获得NSDictionary 后,您可以使用NSPredicate 进行搜索。

希望对您有所帮助

【讨论】:

当然是 N​​SArray 好的,我知道它需要被解析。但我正在写一个分类广告应用程序。当您在主页中并且想要搜索特定项目时,必须将所有 JSON 对象解析为数组或字典。这不好!我需要另一个解决方案。我开始怀疑它是否可能使用 JSON。【参考方案3】:

看看下面这两个链接,在 ios 中解析 Json 文件:

http://www.appcoda.com/fetch-parse-json-ios-programming-tutorial/

http://www.raywenderlich.com/5492/

【讨论】:

【参考方案4】:

假设您将广告数据存储在本地,那么另一种选择是使用 SimpleDB,这是我编写的键/值数据存储。使用它,您可以存储 JSON 值,然后返回符合您要求的键。 (https://github.com/AaronBratcher/SimpleDB)

[SimpleDB setValue:adJSONValue forKey:myKey inTable: kAdsTable];

您的通过测试代码块一次只能解析一项,因此内存不会成为问题,这似乎是您最关心的问题。

您的代码将如下所示:

self.ads = [SimpleDB keysInTable:kAdsTable orderByJSONValueForKey:@"name" passingTest:^BOOL(NSString *key, NSString *value, NSDate *dateAdded, NSDate *dateModified) 
        Ad *ad = [[Ad alloc] initWithJSON:value];
        BOOL include = NO;

        // do testing here

        return include;
    
];

然后,您将使用键来获取 TableView 的行数,并在填充单元格时,根据需要创建对象:

UITableViewCell *cell = AdCell;
Ad *ad = [[Ad alloc] initWithJson:[SimpleDB valueForKey:[self.ads[indexPath.row]] inTable:kAdsTable];
cell.ad = ad;
return cell;

// This is assuming you have a subclass of UITableViewCell to handle the population of the cell's contents.

【讨论】:

以上是关于如何搜索 JSON 文件? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

如何创建用于 UITableView 的 JSON 文件 [关闭]

如何从 iOS 中的文件中解析 JSON? [关闭]

Eclipse json文件报错

如何搜索非常大的 json 文件?

如何从本地 JSON 文件将数据加载到 ViewController [关闭]

如何在巨大的 json 文件之间执行最佳模式搜索?