添加JSON作为资产并阅读它

我试图从本地文件加载一些JSON数据。

在这个苹果文件中说:

使用资产目录pipe理您的应用程序的数据文件。 一个文件可以包含除Xcode生成的设备可执行代码以外的任何types的数据。 您可以将它们用于JSON文件,脚本或自定义数据types

所以我添加了一个新的数据集,并放入了JSON文件。 现在我可以在Assets.xcassets文件夹(Colours.dataset文件夹下面有colours.json和Contents.json文件夹)

我发现这个答案,显示如何阅读一个JSON文件,我用这个代码来读取文件:

if let filePath = NSBundle.mainBundle().pathForResource("Assets/Colours", ofType: "json"), data = NSData(contentsOfFile: filePath) { print (filePath) do { let json = try NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.AllowFragments) print(json) } catch { } } else { print("Invalid file path") } 

但是这个代码是打印“无效的文件path”,而不是读取文件。 我也尝试过“Colors”和“Colours.json”,但无济于事。

任何人都可以请告诉我如何正确添加本地JSON文件并阅读它?

谢谢。

您不能像使用NSBundle.pathForResource访问随机文件一样访问数据资产文件。 由于它们只能在Assets.xcassets中定义, Assets.xcassets需要初始化一个NSDataAsset实例才能访问它的内容:

 let asset = NSDataAsset(name: "Colors", bundle: NSBundle.mainBundle()) let json = try? NSJSONSerialization.JSONObjectWithData(asset!.data, options: NSJSONReadingOptions.AllowFragments) print(json) 

请注意NSDataAsset类是从iOS 9.0和MacOS 10.11开始引入的。

Swift3版本:

 let asset = NSDataAsset(name: "Colors", bundle: Bundle.main) let json = try? JSONSerialization.jsonObject(with: asset!.data, options: JSONSerialization.ReadingOptions.allowFragments) print(json) 

另外,NSDataAsset出人意料地位于UIKit / AppKit中,所以不要忘记在代码中导入相关的框架:

 #if os(iOS) import UIKit #elseif os(OSX) import AppKit #endif 

objC

 #ifdef use_json_in_bundle NSString * path = [mb pathForResource:json_path ofType:@"json" inDirectory:@"JSON"]; NSString * string = [NSString stringWithContentsOfUTF8File:path]; NSData * data = [string dataUsingEncoding:NSUTF8StringEncoding]; #else NSDataAsset * asset = [[NSDataAsset alloc] initWithName:path]; NSLog(@"asset.typeIdentifer = %@",asset.typeIdentifier); NSData * data = [asset data]; #endif NSError * booboo = nil; id blob = [NSJSONSerialization JSONObjectWithData:data options:0 error:&booboo]; 

对于任何一个分支,“path”只是json文件名。