如何搜索非常大的 json 文件?

Posted

技术标签:

【中文标题】如何搜索非常大的 json 文件?【英文标题】:How do I search a very very large json file? 【发布时间】:2016-05-21 23:15:17 【问题描述】:

我有一个巨大的 json 文件,我正在尝试从文件中提取信息,但追踪路径的方式太大了。我可以使用 id 过滤它吗? JSON code 我需要选择课程名称,即

  let urlString = "Can't provide the url"
    if let url = NSURL(string: urlString)
        if let data = try? NSData(contentsOfURL: url, options: [])
            let json = JSON(data: data)
            parseJSON(json)
        
    


func parseJSON(json: JSON)
    for (index: String, subJson: JSON) in json 

    

【问题讨论】:

看文件就知道走哪条路了?这听起来非常奇怪。有一些在线网站允许您粘贴 JSON,它们会为您提供很好的格式。 这只是一个非常长的json文件,我需要的信息在中间 如果您知道您需要哪些信息,然后在密钥上查找并回溯以获取路径。同样,我建议将其粘贴到 JSON 服务中以使其格式化。 我不得不将 JSON 代码放入谷歌文档中,但我更新了问题。 您要在这个 JSON 文件中具体寻找什么? 【参考方案1】:

我想出了一种深度优先的方法,根据谓词查找给定的JSON 对象。

我把它做成了一个扩展:

extension JSON 

    func find(@noescape predicate: JSON -> Bool) -> JSON? 

        if predicate(self) 
            return self
        
        else 
            if let subJSON = (dictionary?.map  $0.1  ?? array) 
                for json in subJSON 
                    if let foundJSON = json.find(predicate) 
                        return foundJSON
                    
                
            
        

        return nil
    

例如,要搜索具有给定id 字段的JSON 对象,例如在问题中,您可以使用以下方法:

let json = JSON(data: data)
let predicate = 
    (json: JSON) -> Bool in
    if let jsonID = json["id"].string where jsonID == "plnMain_ddlClasses" 
        return true
    
    return false

let foundJSON = json.find(predicate)

在这种情况下,如果您需要继续并找到您正在寻找的课程,您会希望:

let classes = foundJSON?["children"].arrayValue.map 
    $0["html"].stringValue

更新 - 查找所有

func findAll(@noescape predicate predicate: JSON -> Bool) -> [JSON] 
    var json: [JSON] = []
    if predicate(self) 
        json.append(self)
    
    if let subJSON = (dictionary?.map $0.1  ?? array) 
        // Not using `flatMap` to keep the @noescape attribute
        for object in subJSON 
            json += object.findAll(predicate: predicate)
        
    
    return json

【讨论】:

我在导入所有“AssignmentClass”时遇到问题。当我做if let jsonID = json["class"].string where jsonID == "AssignmentClass" return true ... 时,我只得到第一个结果(自习室),我明白为什么但仍然不知道如何解决它。 无论哪个 JSON 对象首先满足谓词,都会被返回。如果满足您的谓词的 JSON 在数组中,您可能需要再上一两级。 第二部分看不懂。 您在寻找哪些信息?我会更好地帮助你。 因此,如果您控制 json 页面“AssignmentClass”,那么该数组中应该有 7 个结果,我需要提取类等于 tp“sg-header-heading”的 ["html"]。即第一个应该是"\r\n\t\t\t\t\t0020B - 33 STUDY HALL (INSTRUCT)\r\n\t\t\t\t"

以上是关于如何搜索非常大的 json 文件?的主要内容,如果未能解决你的问题,请参考以下文章

使用 node.js 将非常大的 json 文件索引/摄取到数据库

遍历非常大的 JSON 数组

JSON中非常大的ID,如何在不丢失精度的情况下获取它

如何从文件中流式传输 JSON?

jq map_values 在非常大的文件上

如何在目标c中逐行解析JSON文件