首页 > 解决方案 > 如何在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 但找到了字典。

请你帮助我好吗 ?

标签: arraysjsonswift

解决方案


您需要从顶层解码,因此您的结构应该是这样的

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

推荐阅读