如何搜索 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
进行搜索。
希望对您有所帮助
【讨论】:
当然是 NSArray 好的,我知道它需要被解析。但我正在写一个分类广告应用程序。当您在主页中并且想要搜索特定项目时,必须将所有 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 文件 [关闭]