Swift 4 - Json 解码器

Posted

技术标签:

【中文标题】Swift 4 - Json 解码器【英文标题】:Swift 4 - Json decoder 【发布时间】:2018-09-27 18:36:52 【问题描述】:

我已经搜索了很多并尽力而为,但我被卡住了。

我尝试从 Json 请求(来自 Pexel API)中提取字符串:

这是我提取 json 的代码(导入了 Alamofire 和 SwiftyJson)

  func retrieveapi () 

        let apiKey = "563*****************0c7eae"




        let headers: HTTPHeaders = [
            "Authorization": "5********************ae",
            "Accept": "application/json"
        ]

        Alamofire.request("https://api.pexels.com/v1/search?query=Spain+query&per_page=15&page=1", headers: headers).responseJSON  response in
            if let json = response.result.value 

              print ("json \(json)") 

print("json") 的日志如下

json 
    "next_page" = "https://api.pexels.com/v1/search/?page=2&per_page=15&query=Spain+query";
    page = 1;
    "per_page" = 15;
    photos =     (
                
            height = 2661;
            id = 52062;
            photographer = "tyler hendy";
            src =             
                landscape = "https://images.pexels.com/photos/52062/pexels-photo-52062.jpeg?auto=compress&cs=tinysrgb&fit=crop&h=627&w=1200";
                large = "https://images.pexels.com/photos/52062/pexels-photo-52062.jpeg?auto=compress&cs=tinysrgb&h=650&w=940";
                large2x = "https://images.pexels.com/photos/52062/pexels-photo-52062.jpeg?auto=compress&cs=tinysrgb&dpr=2&h=650&w=940";
                medium = "https://images.pexels.com/photos/52062/pexels-photo-52062.jpeg?auto=compress&cs=tinysrgb&h=350";
                original = "https://images.pexels.com/photos/52062/pexels-photo-52062.jpeg";
                portrait = "https://images.pexels.com/photos/52062/pexels-photo-52062.jpeg?auto=compress&cs=tinysrgb&fit=crop&h=1200&w=800";
                small = "https://images.pexels.com/photos/52062/pexels-photo-52062.jpeg?auto=compress&cs=tinysrgb&h=130";
                square = "https://images.pexels.com/photos/52062/pexels-photo-52062.jpeg?auto=compress&cs=tinysrgb&fit=crop&h=1200&w=1200";
                tiny = "https://images.pexels.com/photos/52062/pexels-photo-52062.jpeg?auto=compress&cs=tinysrgb&fit=crop&h=200&w=280";
            ;
            url = "https://www.pexels.com/photo/water-architecture-colourful-church-52062/";
            width = 4000;
        ,
                  // A lot of more results....

我只想提取:

“风景”的第一个结果。

我试图将它传递给一个 Dict ,一个数组,以使其可编码..但它没有成功。 有人可以帮助我并告诉我如何提取“风景”的第一个(仅第一个)结果吗?

非常感谢!

编辑:找到它并感谢您的提示!

我把它放在像我一样被困住的人..

    if let dictionary = response.result.value as? [String : AnyObject]
        let listData = dictionary["photos"] as! [[String : AnyObject]]
        let photoDict = listData[1]
        let srcDict = photoDict["src"]
        let landscapeStr = srcDict!["landscape"]
        print ("landscapeStr \(landscapeStr!)")

       

【问题讨论】:

欢迎来到 ***。请展示您已经尝试过的内容、无效的内容、代码示例等。请阅读How to Ask 和minimal reproducible example,然后阅读edit 您的问题,其中显示了说明问题的最小 代码. 记得看你的 () 和 。首先是 jsonDict,然后 let photos = json["photos"],是一个字典数组。所以你会想要照片[0] 或 .firstObject。所以 photoDict = 照片[0]。然后让 srcDict = photoDict["src"];现在你终于可以得到风景了 let LandscapeStr = ...你也许能猜到。查看一些 json 并习惯于测试 null/optionals。始终测试并确保您在获得下一个之前/以上抓住了一个,并习惯于记录/打印结果!调试器很棒 您好@AshleyMills 感谢您的帮助/提示。 response.result.value 是什么类型?你用什么解码?你得到什么错误? 你好@F***。我找到了解决方案,正在我的编辑中! 【参考方案1】:

只需使用可解码。

struct Post : Decodable 

    var photo : Photo?
 

struct Photo : Decodable 

    var source : Source?


struct Source : Decodable 

    var landscape : String?


Alamofire.request("https://api.pexels.com/v1/search?query=Spain+query&per_page=15&page=1", headers: headers).responseJSON  response in
    guard let data = response.results.value 

         let post = createObject(json: data, decodable: Post.self)
    


func createObject<D: Decodable> (json : [String: Any], decodable: D.Type) throws -> D 
    return try JSONDecoder().decode(decodable, from: JSONSerialization.data(withJSONObject: snapshot, options: JSONSerialization.WritingOptions.sortedKeys))

【讨论】:

以上是关于Swift 4 - Json 解码器的主要内容,如果未能解决你的问题,请参考以下文章

带有嵌套数据的 Swift 4 JSON 解码器

我如何使用解码器在swift 4中解析tableview中的json数组

Swift 4 解码简单的根级 json 值

如何在 Swift 4 中解码 JSON(JSON Web 令牌)?

Swift 4 JSON 解码根数组

动态 JSON 解码 Swift 4