Swift 4 可解码的 json 数组

Posted

技术标签:

【中文标题】Swift 4 可解码的 json 数组【英文标题】:Swift 4 decodable json arrays 【发布时间】:2017-09-24 22:17:59 【问题描述】:

所以我目前正在开发一个程序来解析底部链接的 JSON Api

当我运行代码时,我得到了一些输出,但不是全部

主要用于可选的动漫类型,这很好,因为它表明它可以工作,但我也想访问名称和发布日期和语言,但是我不知道如何在 swift 4 中使用这样的 JSON 数组。我将在下面附上我当前的代码。

import UIKit

struct AnimeJsonStuff: Decodable 
    let data: [AnimeDataArray]


struct AnimeDataArray: Decodable 
    let type: String?


class OsuHomeController: UICollectionViewController, UICollectionViewDelegateFlowLayout 
    func jsonDecoding() 
        let jsonUrlString = "https://kitsu.io/api/edge/anime"

        guard let url = URL(string: jsonUrlString) else return //
        URLSession.shared.dataTask(with: url)  (data, response, err) in

            guard let data = data else return

            do 
                let animeJsonStuff =  try JSONDecoder().decode(AnimeJsonStuff.self, from: data)
                print(animeJsonStuff.data)

                let animeDataArray = try JSONDecoder().decode(AnimeDataArray.self, from: data)
                print(animeDataArray.type as Any)
             catch let jsonErr 
                print("Error serializing json", jsonErr)
            
        .resume()
    

在那之后我有更多的代码,但它只是用于设置自定义 collectionViewCells。

这里还有api的链接

【问题讨论】:

有什么问题?此外,如果这是关于解析特定 JSON 字符串,请将字符串 粘贴到您的问题中;不要显示代码的图片,这对任何人都没有好处。 【参考方案1】:

标题“Swift 4 decodeable json arrays”的答案

let decoder = JSONDecoder()
do 
   let array = try decoder.decode([YouCodableStruct].self, from: response.data!)
   debugPrint(array)
 catch 
   debugPrint("Error occurred")

http://andrewmarinov.com/parsing-json-swift-4/

【讨论】:

【参考方案2】:

请检查以下内容:

我不会为所有键添加。我在attributes添加了一些。

struct AnimeJsonStuff: Decodable 
    let data: [AnimeDataArray]


struct AnimeLinks: Codable 
    var selfStr   : String?

    private enum CodingKeys : String, CodingKey 
        case selfStr     = "self"
    

struct AnimeAttributes: Codable 
    var createdAt   : String?

    private enum CodingKeys : String, CodingKey 
        case createdAt     = "createdAt"
    

struct AnimeRelationships: Codable 
    var links   : AnimeRelationshipsLinks?

    private enum CodingKeys : String, CodingKey 
        case links     = "links"
    


struct AnimeRelationshipsLinks: Codable 
    var selfStr   : String?
    var related   : String?

    private enum CodingKeys : String, CodingKey 
        case selfStr     = "self"
        case related     = "related"
    


struct AnimeDataArray: Codable 
    let id: String?
    let type: String?
    let links: AnimeLinks?
    let attributes: AnimeAttributes?
    let relationships: [String: AnimeRelationships]?

    private enum CodingKeys: String, CodingKey 
        case id = "id"
        case type = "type"
        case links = "links"
        case attributes = "attributes"
        case relationships = "relationships"
    

Json 解析:

func jsonDecoding() 
    let jsonUrlString = "https://kitsu.io/api/edge/anime"

    guard let url = URL(string: jsonUrlString) else return //
    URLSession.shared.dataTask(with: url)  (data, response, err) in
        guard let data = data else return
        do 
            let animeJsonStuff =  try JSONDecoder().decode(AnimeJsonStuff.self, from: data)
            for anime in animeJsonStuff.data 
                print(anime.id)
                print(anime.type)
                print(anime.links?.selfStr)
                print(anime.attributes?.createdAt)
                for (key, value) in anime.relationships! 
                    print(key)
                    print(value.links?.selfStr)
                    print(value.links?.related)
                
            
         catch let jsonErr 
            print("Error serializing json", jsonErr)
        
    .resume()

【讨论】:

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

如何解码包含数组 Swift 4 的 JSON 文件?

Swift 4 可解码 - 附加变量

在 swift 4 和 Xcode 9 中解码 ExpandableTableView 的嵌套 json 数组

如何在 swift 4.1 和 xcode 9.3 中使用 JSONDecoder 解码嵌套的 JSON 数组和对象?

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

Swift - 解码数组 JSON 数据的数组