arrays - 如何在json中仅获取Array部分
问题描述
Json: {"photos":{"page":1,"pages":20,"perpage":100,"total":"1941","photo":[{"id":"40270314685","owner ":"24843974@N00","secret":"46f5a82bd3","server":"785","farm":1,"title":"Raleigh C Easter 2018-30","ispublic":1," isfriend":0,"isfamily":0},{"id":"39355840240","owner":"24843974@N00","secret":"eb23dc2e68","server":"816","farm" :1,"title":"Raleigh C Easter 2018-31","ispublic":1,"isfriend":0,"isfamily":0},{"id":"40270318535","owner":"24843974 @N00","秘密":"97c6280b2f","server":"811","farm":1,"title":"Raleigh C Easter 2018-32","ispublic":1,"isfriend":0,"isfamily":0}] },"stat":"ok"}
我只想获取 "photo":[{"id":"402703146... 部分作为数组。这是我的代码
结构GetPhotosOfUser:可解码{
let id: String
let secret: String
let server: String
let farm: String
enum TopLevelCodingKeys: String, CodingKey {
case photos
}
enum UserCodingKeys: String, CodingKey {
case photo
}
enum SecondCodingKeys: String, CodingKey {
case id
case secret
case server
case farm
}
init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: TopLevelCodingKeys.self)
let userContainer = try container.nestedContainer(keyedBy: UserCodingKeys.self, forKey: .photos)
let userContainer1 = try userContainer.nestedContainer(keyedBy: SecondCodingKeys.self, forKey: .photo)
id = try userContainer1.decode(String.self, forKey: .id)
secret = try userContainer1.decode(String.self, forKey: .secret)
server = try userContainer1.decode(String.self, forKey: .server)
farm = try userContainer1.decode(String.self, forKey: .farm)
}
}
var getphotos = [GetPhotosOfUser]()
func downloadJSON(completed: @escaping () -> ()){
let url = URL(string: "https://www.flickr.com/services/rest/?method=flickr.people.getPhotos&api_key=<api-key>&user_id=24843974@N00&format=json&nojsoncallback=1")
URLSession.shared.dataTask(with: url!) { (data, response, error) in
if error == nil{
do{
self.getphotos = try JSONDecoder().decode([GetPhotosOfUser].self, from: data!)
DispatchQueue.main.async {
completed()
print("Json Baglandi")
print(self.getphotos.count)
}
}catch{
print("JSON Error")
print(error)
}
}
}.resume()
}
但它说“”预期解码 Array 但找到了字典。
请你帮助我好吗 ?
解决方案
您需要从顶层解码,因此您的结构应该是这样的
struct TopLevel : Decodable {
let photos: SubLevel
}
struct SubLevel: Decodable {
let photo: [GetPhotosOfUser]
}
struct GetPhotosOfUser: Decodable{
let id: String
let secret: String
let server: String
let farm: Int //Obs! I changed the type here
}
然后在解码时需要将代码更改为
let result = try JSONDecoder().decode(TopLevel.self, from: data!)
self.getphotos = result.photos.photo
推荐阅读
- java - 如何使用外部属性文件在 Springboot 中使用 log4j2?
- javascript - Apostrophe Js - 上传文件 (apostrophe-pieces-submit-widgets)
- python - 如何从 Pyschool 中找到更有效的方法来解决这个问题?
- c# - 在 ASP.NET MVC 中填充 DropDownList
- javascript - ReferenceError:使用 ClearScript(V8ScriptEngine) 时未定义 XMLHttpRequest
- android - 是否可以根据 Google Maps API 中的城市名称对标记进行聚类
- javascript - 将对象转换为数组 Angular
- c++ - 在主函数之外全局初始化数组元素时出错
- node.js - ibeacon - raspberry pi 对信标的检测不一致
- security - 如何禁用 python 密钥环的命令行密码提示 - headless debian linux