添加JSON作为资产并读取它

时间:2015-11-09 21:17:10

标签: ios swift

我正在尝试从本地文件加载一些JSON数据。

this Apple doc中说:

  

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

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

我发现this SO答案显示了如何读取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")
    }

但是此代码正在打印“无效的文件路径”而不是正在读取文件。我也试过“颜色”和“Colours.json”,但无济于事。

有谁能告诉我如何正确添加本地JSON文件并阅读它?

感谢。

2 个答案:

答案 0 :(得分:12)

您无法使用NSBundle.pathForResource访问随机文件的方式访问数据资产文件。由于它们只能在Assets.xcassets内定义,因此您需要初始化NSDataAsset实例才能访问其中的内容:

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

请注意,自{i} 9.0及更高版本引入了NSDataAsset课程。 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

答案 1 :(得分:1)

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];

任何一个分支,'路径'只是json文件名。