如何解析 JSON 以将其转换为 Swift 中的对象数组?

Sep*_*Dev 9 json ios swift

这是我网站上的 json 示例:

[{
    "id": "1",
    "day": "Saturday 3/10",
    "title": "title1",
    "description": "lorem ipsum dolor sit amet consectetur adipiscing elit",
    "image": ""
},
{
    "id": "2",
    "day": "Saturday 10/10",
    "title": "title2",
    "description": "lorem ipsum dolor sit amet consectetur adipiscing elit",
    "image": ""
},
{
    "id": "3",
    "day": "Saturday 17/10",
    "title": "title3",
    "description": "lorem ipsum dolor sit amet consectetur adipiscing elit",
    "image": ""
}]
Run Code Online (Sandbox Code Playgroud)

现在我想将每个对象保存在一个对象数组中,但可能有三个以上的元素。我想我必须使用,NSJsonSerialization因为我必须从 url 获取它。

(我正在使用 swift 2)

Cai*_*son 6

我个人会使用 NSArrays 和 NSDictionaries 来引用 JSON 中的每个对象。像这样的东西就足够了(假设JSON是您的 JSON 变量)

if let array = JSON as? NSArray {
    for obj in array {
        if let dict = obj as? NSDictionary {
            // Now reference the data you need using:
            let id = dict.valueForKey("id")
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


rad*_*vus 6

在 Swift 4.x 中有一种简单的方法可以做到这一点,但我很难得到简单的答案,所以我会在这里发布。

第 1 步:创建一个与您的 JSON 匹配并从 Codable 派生的类。在这里,我随意将类(包装原始 JSON)命名为BlogPost.

您还需要添加一个 init 方法

class BlogPost : Codable{
    var id : Int
    var day : Date
    var title : String
    var description : String

    init (id : Int, day : Date, title : String, description : String){
         self.id = id;
         self.day = day;
         self.title = title;
         self.description = description;
    }
}
Run Code Online (Sandbox Code Playgroud)

第 2 步:添加一个加载方法来加载您的数组。

它将需要一个文件名(指向带有 json 的文件)并返回一个 BlogPost 数组([BlogPost])

 func loadJson(filename fileName: String) -> [BlogPost]? {
        if let url = Bundle.main.url(forAuxiliaryExecutable: fileName) {
            do {
                let data = try Data(contentsOf: url)
                let decoder = JSONDecoder()
                let allBlogPosts = try decoder.decode([BlogPost].self, from: data)
                return allBlogPosts
            } catch {
                print("error:\(error)")
            }
        }
        return nil
    }
Run Code Online (Sandbox Code Playgroud)

}

我认为棘手的部分是您发送给解码器方法的类型。由于我们要解码一组 Decodable BlogPost 对象,我们必须使用:[BlogPost].self

decoder.decode([BlogPost].self, from: data)
Run Code Online (Sandbox Code Playgroud)