这是我网站上的 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)
我个人会使用 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)
在 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)
归档时间: |
|
查看次数: |
12190 次 |
最近记录: |