JSON 序列化错误“字符 0 处的值无效

Posted

技术标签:

【中文标题】JSON 序列化错误“字符 0 处的值无效【英文标题】:JSON Serialization Error "Invalid value at character 0 【发布时间】:2018-05-30 19:28:33 【问题描述】:

我只是了解如何使用 .json 文件从 ios 应用程序读取和写入数据。目前我有一个应用程序,其中文本字段中的任何内容都将写入 json 文件,然后当按下按钮时,它会显示刚刚写入标签的内容。基本上只是测试阅读和写作。它从 json 文件中读取初始值很好,但是当我写入 json 文件然后尝试再次读取它时,它给了我错误:

“线程 1:致命错误:'try!'表达式意外引发错误:Error Domain=NSCocoaErrorDomain Code=3840 "Invalid value around character 0." UserInfo=NSDebugDescription=Invalid value around character 0."。

感谢任何帮助。

@IBAction func UpdateLabelTapped(_ sender: UIButton) 
    let path = Bundle.main.path(forResource: "SaveData", ofType: "json")
    let url = URL(fileURLWithPath: path!)

    let data = try! Data(contentsOf: url)
    let obj = try! JSONSerialization.jsonObject(with: data, options: .allowFragments)

    if let str = (obj as! NSDictionary).value(forKey: "message") 
        self.DataLabel.text = str as? String ?? ""
    


@IBAction func WriteToJSONTapped(_ sender: UIButton) 
    let path = Bundle.main.path(forResource: "SaveData", ofType: "json")
    let url = URL(fileURLWithPath: path!)

    let dict = NSMutableDictionary()
    dict.setValue("Writing JSON!!", forKey: "message")
    dict.write(to: url, atomically: true)

它出现在写着let obj = try! JSONSerialization.jsonObject(with: data, options: .allowFragments)的那一行

【问题讨论】:

你到底想做什么?在点击一个按钮时写入 json 并在点击另一个按钮时读取它? 没错。当一个按钮被按下时,它将一个值写入一个 JSON 文件,当另一个按钮被按下时,它读取并显示它 错误表示第一个字符不是有效的 JSON。除了问题之外,您无法写入应用程序包。该捆绑包是只读的。并且不要在 Swift 中使用NS(Mutable)Dictionary,使用本机类型。顺便说一句,NSDictionarywrite API 写入属性列表,而不是 JSON。 value(forKey 不好,大写的变量和函数名也不好。 读取和写入文件见:***.com/questions/24097826/… 【参考方案1】:

我觉得这很可疑:

dict.write(to: url, atomically: true)

write(to:atomically:)saves 属性列表格式的字典,而不是 JSON。要编写 JSON,请尝试以下操作:

let jsonData = try! JSONSerialization.data(withJSONObject: dict)
try! jsonData.write(to: url, options: [])

注意:确保在生产代码中正确处理错误。 :-)

【讨论】:

以上是关于JSON 序列化错误“字符 0 处的值无效的主要内容,如果未能解决你的问题,请参考以下文章

Newtonsoft JSON.NET 反序列化错误

JSON 序列化错误“字符 0 处的值无效

错误:预期状态。无法反序列化 JSON 对象

Spring Boot JSON解析错误:无法反序列化错误

[错误]:返回的对象不是 JSON 可序列化的

我用 NSDictionary & JSON 序列化 & NSUserDefaults 错误地实现了啥?