如何在Swift 3中解析巨大的JSON文件?

时间:2016-10-06 09:07:34

标签: ios json swift

这就是我现在所拥有的:

  • 4个JSON文件
  • 每个文件中
  • ~2 000 000行
  • 每个文件约250MB

    if let path = Bundle.main.path(forResource: "file_1", ofType: "json") {
    
        let url = URL(fileURLWithPath: path)
    
        do {
    
            let data = try Data(contentsOf: url, options: Data.ReadingOptions.mappedIfSafe)
    
            do {
    
                if let results = try JSONSerialization.jsonObject(with: data, options: JSONSerialization.ReadingOptions.mutableContainers) as? Array<[AnyHashable: Any]> {
                    //do sth here with that
                }
    
            } catch {
                print("error1: \(error)")
            }
    
        } catch {
            print("error2: \(error)")
        }
    }
    

但我所拥有的只是一个错误:

  

来自调试器的消息:由于内存问题而终止

是否有可能在Swift中使用iphone解析4个json文件?我需要在几秒钟内解析它。

3 个答案:

答案 0 :(得分:1)

这一行

let data = try Data(contentsOf: url, options: Data.ReadingOptions.mappedIfSafe)

使用大约250MB的内存。对于应用来说,这是一个巨大的数额。特别是如果你加载4个文件。您的内存使用量约为1GB。所以用两个词来说 - 这是不可能的。您需要找到更好的问题解决方案。

答案 1 :(得分:1)

您可以尝试使用此库:https://github.com/postmates/PMJSON

我还没有尝试过,但似乎是一种可能的解决方案。

抱歉我的英文。

答案 2 :(得分:0)

Swift 5.1 将以下代码用于巨大的JSON 文件。它对我有用。

    func readJSONFromFile(fileName: String) -> Any?
    {
        var json: Any?
        if let path = Bundle.main.path(forResource: fileName, ofType: "json") {
            do {
                let fileUrl = URL(fileURLWithPath: path)
                // Getting data from JSON file using the file URL
                let data = try Data(contentsOf: fileUrl, options: .mappedIfSafe)
                json = try? JSONSerialization.jsonObject(with: data, options: .allowFragments)
                print(json)
            } catch {
                // Handle error here
            }
        }
        return json
    }