Swift:无法读取数据,因为格式不正确

问题描述 投票:-1回答:2

我尝试用Alamofire调用POST Api,但它显示错误的格式错误。

这是我的JSON响应:

[
  {
    "_source": {
      "nome": "LOTERIAS BELEM",
      "endereco": "R DO COMERCIO, 279",
      "uf": "AL",
      "cidade": "BELEM",
      "bairro": "CENTRO"
    },
    "_id": "010177175"
  },
  {
    "_source": {
      "nome": "Bel Loterias"
    },
    "_id": "80224903"
  },
  {
    "_source": {
      "nome": "BELLEZA LOTERIAS",
      "endereco": "R RIVADAVIA CORREA, 498",
      "uf": "RS",
      "cidade": "SANTANA DO LIVRAMENTO",
      "bairro": "CENTRO"
    },
    "_id": "180124986"
  }
]

class Album: Codable {
    var _source :  [_source]

}

class _source: Codable {
    var nome :  String
    var endereco : String
    var uf : String
    var cidade : String
    var bairro : String
}

var arrList = [Album]()

这就是我尝试用Alamofire解码的方法。

func request() {

        let urlString = URL(string: "My Url")
      //  Alamofire.request(url!).responseJSON {(response) in

        Alamofire.request(urlString!, method: .post, parameters: ["name": "belem"],encoding: JSONEncoding.default, headers: nil).responseJSON {
            (response) in

            switch (response.result) {
            case .success:
                if let data = response.data {
                    do {
                        let response = try JSONDecoder().decode([Album].self, from: data)
                        DispatchQueue.main.async {
                             self.arrList = response
                        }
                    }
                    catch {
                        print(error.localizedDescription)
                    }
                }
            case .failure( let error):
                print(error)
            }
       }
 }
json swift alamofire jsondecoder
2个回答
1
投票

只是你的Album模型不正确。

struct Album: Codable {
    var source : Source
    var id     : String

    enum CodingKeys: String, CodingKey {
        case source = "_source"
        case id = "_id"
    }
}

struct Source: Codable {
    var nome     : String
    var endereco : String?
    var uf       : String?
    var cidade   : String?
    var bairro   : String?
}

如果您不想完全使用_id,那么只需删除相关部分即可。 至于你的Alamofire相关代码,那部分是好的。


显着改进:

  • 通过自定义CodingKeys以进行键映射,避免在模型中使用下划线变量名
  • 类型名称应始终以大写字母开头(所以_sourceSource) 同样,变量名应始终以小写字母开头
  • 使一些变量可选(基于您更新的响应) 保持变量非可选意味着它必须存在于要创建的模型的响应中 使变量可选意味着响应中可能存在或不存在键,并且它不存在将不会阻止创建模型

0
投票

我想建议你使用json4swift.com。你只需要复制你的json并粘贴在那里。它将自动从您的json创建模态结构或类。

回到你的问题,你的班级专辑没有[_source]数组。这就是你得到以下错误的原因“数据无法读取,因为它的格式不正确”。

尝试以下给定的专辑类格式,

class Album: Codable
{ 
  var source: Source?
  var id: String?
}

请尽量避免在Swift中使用下划线。

© www.soinside.com 2019 - 2024. All rights reserved.