附加 JSON 数据 Swift

Posted

技术标签:

【中文标题】附加 JSON 数据 Swift【英文标题】:Appending JSON data Swift 【发布时间】:2020-01-23 03:04:02 【问题描述】:

我目前正在从事一个学校项目,我需要能够读取、写入和查看 JSON 文件中的信息。对于我的任务,我正在尝试构建一个字典应用程序,您可以在其中添加自己的单词、定义等。

我一直在尝试将新数据写入 JSON 文件而不覆盖旧数据。 我在最后一行也有一个我感到困惑的错误。

这是我到目前为止的代码。

    func fileUrl() -> URL 
    let documentURL = try!
        FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: true)
    return documentURL.appendingPathComponent("data.json")


@IBAction func addWords(_ sender: UIButton) 
    if let oldWords:[[String : String]] = getJsonData() as [[String:String]]? 
        if let oldJson = try? JSONSerialization.data(withJSONObject: oldWords, options: []) 
            // Add old words to JSON file
        
    
    let data: [String:String] = [
        "Name": nameField.text ?? "N/A",
        "Part of Speech": posField.text ?? "N/A",
        "Definition": defView.text ?? "N/A"

    ]
    let url = fileUrl()
    if let jsonData = try? JSONSerialization.data(withJSONObject: data, options: []) 
        // Append data into JSON file
        print(data)
        nameField.text = ""
        defView.text = ""
        posField.text = ""
     else 
        print("Failed to save")
    


func getJsonData() -> [[String:String]]? 
    let url = fileUrl()
    let responseData: Data? = try! Data(contentsOf: url)
    if let responseData = responseData 
        let json: String? = try? JSONSerialization.jsonObject(with: responseData, options: []) as? String
        if let dictionary: [[String:String]]? = json as? [[String:String]]? 
            return dictionary
        
    
 // Missing return in a function expected to return '[[String : String]]?' error
@IBAction func loadData(_ sender: UIButton) 
    let url = fileUrl()
    let responseData: Data? = try! Data(contentsOf: url)
    if let responseData = responseData 
        let json: Any? = try? JSONSerialization.jsonObject(with: responseData, options: [])
        if let json = json 
            let dictionary: [String: Any]? = json as? [String: Any]
            if let dictionary = dictionary 
                for names in dictionary 
                    let name: String = dictionary["Name"] as! String
                    let definition: String = dictionary["Definition"] as! String
                    let pos: String = dictionary["Part of Speech"] as! String
                    print(name, definition, pos)
                    textView.text = ("Name: \(name) (\(pos))\n Definition: \(definition)\n ")
                
            
        
    

我一直在研究一种添加 JSON 数据的方法,但也许我已经盯着代码太久了,以至于我错过了一个简单的修复方法。

【问题讨论】:

【参考方案1】:

swift 中没有原生方式,也没有第三方库将 json 对象附加到文件。

您需要做的是,当您调用 getJsonData 时,您将 JSON 的全部内容保存到一个变量中并从那里追加。我建议查看 Daniel's answer 以获得将 JSON 附加在一起的简单扩展。如果您需要更多帮助,请告诉我!

关于最后一行的错误 - 永远不要强制展开变量是一种很好的做法。鉴于我们看不到 JSON 树,这很难说;但请确保您访问的是正确的位置。 print(dictionary) 你的字典并尝试一些调试和/或为你的数组创建验证。

【讨论】:

以上是关于附加 JSON 数据 Swift的主要内容,如果未能解决你的问题,请参考以下文章

仅在 Json Swift 3 中附加数组的第一项

Swift JSON响应两个字段值附加到单个数组中

附加到 JSON 字典

Swift 4 可解码 - 附加变量

Firebase 在 Swift 中检索低于自动 ID 的数据

Swift-使用委托将数据附加到 CollectionView 中的 TableView