首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果两个数据类型中的一个总是为空,如何解码两个数据类型中的可编码属性?

如果两个数据类型中的一个总是为空,如何解码两个数据类型中的可编码属性?
EN

Stack Overflow用户
提问于 2018-05-09 04:03:24
回答 4查看 294关注 0票数 1

我从post请求中收到这个JSON:

代码语言:javascript
复制
"clinic_info": {
                "city": "Querétaro",
                "state": "Querétaro",
                "country": "México",
                "phone": null,
                "ext": null,
                "coords": "20.6046089,-100.37826050000001",
                "location": "Querétaro"
            }

但是当它为空时,JSON是:

代码语言:javascript
复制
"clinic_info": []

这会产生一个错误:期望对Dictionary进行解码,但找到了一个数组。

EN

回答 4

Stack Overflow用户

发布于 2018-05-09 04:07:51

这是因为decoder想要dictionary,而您的JSONarray

需要在decoding之前检查JSON响应是dictionary还是Array,并相应地执行decoding

如果你找到了Dictionary,你可以这样做

代码语言:javascript
复制
let myData = try JSONDecoder().decode(YourModel.self, from: jsonData)

如果你找到了Array,你可以这样做

代码语言:javascript
复制
let myData = try JSONDecoder().decode([YourModel].self, from: jsonData)
票数 2
EN

Stack Overflow用户

发布于 2018-05-09 04:10:45

Array类有一个用于此目的的方法。

使用typeof将始终返回"object"

下面的代码显示了如何在Array类中使用isArray()方法。

代码语言:javascript
复制
const obj = {
  _array: [],
  _object: {}
}

console.log(Array.isArray(obj._array)); // true
console.log(Array.isArray(obj._object)); // false
票数 0
EN

Stack Overflow用户

发布于 2018-05-09 04:13:03

您可以像这样使用try, throw来完成此操作

代码语言:javascript
复制
import Foundation

struct ClinicData: Codable {
    let clinicInfo: ClinicInfo?

    enum CodingKeys: String, CodingKey {
        case clinicInfo = "clinic_info"
    }
}

struct ClinicInfo: Codable {
    let city, state, country: String
    let coords, location: String
}

// MARK: Convenience initializers

extension ClinicData {
    init(data: Data) throws {
        self = try JSONDecoder().decode(ClinicData.self, from: data)
    }

    init(_ json: String, using encoding: String.Encoding = .utf8) throws {
        guard let data = json.data(using: encoding) else {
            throw NSError(domain: "JSONDecoding", code: 0, userInfo: nil)
        }
        try self.init(data: data)
    }


    func jsonData() throws -> Data {
        return try JSONEncoder().encode(self)
    }

    func jsonString(encoding: String.Encoding = .utf8) throws -> String? {
        return String(data: try self.jsonData(), encoding: encoding)
    }
}


**get clinicInfo** 

   if  let clinicData =  try? ClinicData.init(data: Data()), let clinicInfo = 
    clinicData.clinicInfo{

        }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50241468

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档