【问题标题】:Swift - Expected to decode Array<Any> but found a dictionary instead.”, underlyingError: nilSwift - 预期解码 Array<Any> 但找到了字典。”,underlyingError: nil
【发布时间】:2020-10-05 12:45:36
【问题描述】:

我正在尝试为我的应用程序解码一些 json,我通常会这样做。

我的结构;

struct RequestTypes: Codable {
      let MerchRequestTypeID: Int?
      let TypeName: String?
      let LayoutID: Int?

   private enum CodingKeys: Int, CodingKey {
       case MerchRequestTypeID
       case TypeName
       case LayoutID
       }
}

并解码;

func downloadRequestTypesJson(){
    guard let gitUrl = URL(string: "URL") else { return }
    URLSession.shared.dataTask(with: gitUrl) { (data, response
        , error) in
        guard let data = data else { return }
        do {
            let decoder = JSONDecoder()
            let RequestData = try decoder.decode(Array<RequestTypes>.self, from: data)
            DispatchQueue.main.sync {
                print(RequestData[0].MerchRequestTypeID)
                print(RequestData[1].MerchRequestTypeID)
                print(RequestData[2].MerchRequestTypeID)
            }
        } catch let err {
            print("Err", err)
        }
        }.resume()
}

这适用于以下 json;

[
   {
     "MerchRequestTypeID": 1,
     "TypeName": "Stok",
     "LayoutID": 1
   },
   {
     "MerchRequestTypeID": 2,
     "TypeName": "Stand",
     "LayoutID": 2
   },
   {
     "MerchRequestTypeID": 3,
     "TypeName": "Eğitim",
     "LayoutID": 2
   }
]

但现在我需要解码这个 json 并且我得到 预期解码 Array 但找到了字典。 错误;

{
  "RequestTypes": [
   {
     "MerchRequestTypeID": 1,
     "TypeName": "Stock",
     "LayoutID": 1
   },
   {
     "MerchRequestTypeID": 2,
     "TypeName": "Stand",
     "LayoutID": 2
   },
   {
     "MerchRequestTypeID": 3,
     "TypeName": "Education",
     "LayoutID": 2
   }
  ]
}

无法找到正确的方法来执行此操作。任何帮助表示赞赏。

编辑:我是 Swift 的初学者。我想知道如何解码第二个 json 以及如何访问它的元素。

【问题讨论】:

  • let RequestData = try decoder.decode([String: [RequestTypes]].self, from: data)
  • 你看到有一个新的键“RequestTypes”,你在哪里解码?
  • 问题是什么?第二个 JSON 和第一个 JSON 不同,它确实很明显是一个字典,而不是像第一个那样的数组。错误消息和 JSON 告诉你所有需要知道的。

标签: swift xcode swift5 jsondecoder


【解决方案1】:

这是因为您尝试使用“RequestTypes”属性而不是数组来解码 JSON 对象。一种解决方案是为此数据结构创建一个新结构并使用它来解码您的 JSON:

struct RequestTypesContainer: Codable {
    let RequestTypes : [RequestTypes]

    private enum CodingKeys: String, CodingKey {
       case RequestTypes
    }
}

然后:

let RequestData = try decoder.decode(RequestTypesContainer.self, from: data)

【讨论】:

  • 首先感谢您的帮助。使用 RequestData.RequestTypes[0].TypeName! 达到其元素
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-10-15
  • 2019-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多