添加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文件名。