如何使用路径中文件中的数组序列化 JSON 数组?

Posted

技术标签:

【中文标题】如何使用路径中文件中的数组序列化 JSON 数组?【英文标题】:How can I serialize Array of JSON with arrays from a file in path? 【发布时间】:2020-01-03 03:37:18 【问题描述】:

我在我的 Xcode 项目中使用 Swift 有一个 .json 文件。 我需要加载内容并解析以在我的控制器中使用,但是当我尝试将文件内容序列化为 jsonObject 时,我遇到了解析错误...

我已经阅读了另一个类似的问题,但我还没有找到一个类似的 JSON 数组来读取,其中包含不同的结构和另一个 JSON 数组到对象中。

数组JSON格式为:

[
  
    "title": "The App",
    "description": "This is the description",
    "friends": [
      
        "name": "Gary",
        "image": "http://",
        "description": "Nice"
      ,
      
        "name": "Patri",
        "image": "http://",
        "description": "Amazing"
      ,
      
        "name": "Lucy",
        "image": "http://",
        "description": "Up"
      
    ]
  
]

我正在使用此代码从捆绑路径(添加到我的项目中的 data.json)获取文件的内容,然后进行序列化,但总是出错,因为 Friends 包含一个 json 数组。

let path = Bundle.main.path(forResource: "data", ofType: "json")
let jsonData = try! Data(contentsOf: URL(fileURLWithPath: path!))
let jsonResult = try! JSONSerialization.jsonObject(with: jsonData, options: []) as? [[String:Any]] //Here is the error parsing the array of Friend of JSON

如何解析这个包含另一个 jsonObjects 数组的 json 数组?

【问题讨论】:

其他似乎有问题。即使它在数组中包含 JSON 对象,这仍然应该是完全有效的 JSON 并且可解析 您应该考虑实现Codable。并且不要做try!,花时间实施一些适当的错误处理 @Mike 你是对的,物品描述朋友的文字有无效字符 【参考方案1】:

你需要使用Codable

// MARK: - Element
struct Root: Codable 
    let title, purpleDescription: String
    let friends: [Friend]

    enum CodingKeys: String, CodingKey 
        case title
        case purpleDescription = "description"
        case friends
    


// MARK: - Friend
struct Friend: Codable 
    let name, image, friendDescription: String

    enum CodingKeys: String, CodingKey 
        case name, image
        case friendDescription = "description"
    


let url = Bundle.main.url(forResource: "data", withExtension: "json")
let jsonData = try! Data(contentsOf:url)
let res = try! JSONDecoder().decode([Root].self,from:data)
print(res)

【讨论】:

try!,真的吗? @JoakimDanielson json 是本地的,没有可用的崩溃,只需运行 1 次即可验证它是否会成功,如果开发人员知道,一般! 并不危险什么时候使用它 是的,但是考虑到这个问题,我认为 OP 没有那么有经验,所以适当的错误处理更合适。 @JoakimDanielson 你是对的,但是读到你们两个我明白,如果 JSON 从可能无法到达的服务接收到错误,我应该处理该错误。文本包含无效字符,所以我的方法不起作用。但我给出的答案是正确的,因为它有效并且是我使用 Codable 的一种新方式。谢谢!

以上是关于如何使用路径中文件中的数组序列化 JSON 数组?的主要内容,如果未能解决你的问题,请参考以下文章

在反序列化时如何忽略JSON对象数组中的空白数组?

如何使用 Newtonsoft.Json 正确反序列化数组中的嵌套对象? [复制]

C# 如何反序列化简单结构中的 json DATAS 数组?

C# JSON 反序列化:如何从 JSON 对象数组中获取值 [重复]

如何使用 Jackson 解析 JSON 数组项中的原始值?

C# Json数组序列化和反序列总结