Swift 4:解码数组

时间:2017-10-14 09:08:54

标签: arrays json swift decode

我想在Xcode 9上使用Swift 4中的Decode协议轻松解码JSON文件。我的问题是: 如何像这样解码àJSON:

[
  {
    "name": "My first Catalog",
    "order": 0,
    "products": [
      {
        "product": {
          "title": "product title",
          "reference": "ref"
        }
      }
    ]
  }
]

我试试这个,但它不起作用

fileprivate struct Catalog: Codable {
    var name: String
    var order: Int
    var product: [Product]
}

fileprivate struct Product: Codable {
    var title: String
    var reference: String
}

...

// JSON Decoder
        do {
            let jsonData = try Data(contentsOf: URL(fileURLWithPath: filePath), options: .alwaysMapped)

            let jsonDecoder = JSONDecoder()

            let jsonCatalogs = try? jsonDecoder.decode(Array<Catalog>.self,
                                                       from: jsonData)


            return jsonCatalogs

        } catch {
            print ("error")
            return nil
        }

我不知道为什么它在使用Xcode 9的Swift 4中不起作用。感谢您的帮助; - )

2 个答案:

答案 0 :(得分:5)

实际上,你的结构是错误的,

    fileprivate struct Catalog: Codable {
        var name: String
        var order: Int
        var products: [Products] // this key is wrong in your question, it should be products instead of product
    }

    //this particular structure was missing as your products is having a dictionary and in that dictionary you are having product at key product
    fileprivate struct Products: Codable {
        var product: Product
    }
    fileprivate struct Product: Codable {
        var title: String
        var reference: String
    }

现在您可以检查您的功能,也可以使用带有错误处理的try catch轻松调试它

...

// JSON解码器

  do {
        let jsonData = try Data(contentsOf: URL(fileURLWithPath:filePath), options: .alwaysMapped)

        let jsonDecoder = JSONDecoder()

        let jsonCatalogs = try? jsonDecoder.decode(Array<Catalog>.self,from: jsonData)
        print(jsonCatalogs)
        return jsonCatalogs

    } catch let error {
        print ("error -> \(error)") // this will always give you the exact reason for which you are getting error
        return nil
    }

答案 1 :(得分:-1)

根据您的JSON尝试此解决方案,并且我已经在xcode 9.4的Swift 4中使用了Decoder。

    struct Catalog : Decodable {
        let name : String?
        let order : Int?
        let productArray : [Products]? // this is products array.
 }

    struct Products : Decodable {
        let productDict : Product? // this is product dictionary
 }
    struct Product : Decodable {
        let title : String?
        let reference : String? 
}
 var catalogArray = [Catalog]() // Declaration

    // JSON Decoder   
do {
            let jsonData = try Data(contentsOf: URL(fileURLWithPath:filePath), options: .alwaysMapped)
            let jsonDecoder = JSONDecoder()
            let jsonCatalogs = try? jsonDecoder.decode(Catalog.self,from: jsonData)
            return jsonCatalogs
        } catch let error {
            print ("error -> \(error)") // this will always give you the exact reason for which you are getting error
            return nil
        }

*