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

时间:2018-05-08 20:03:24

标签: json swift swift4 decode decodable

我收到了一个帖子请求,这个JSON:

"clinic_info": {
                "city": "Querétaro",
                "state": "Querétaro",
                "country": "México",
                "phone": null,
                "ext": null,
                "coords": "20.6046089,-100.37826050000001",
                "location": "Querétaro"
            }

但是当它为空时,JSON是:

"clinic_info": []

这会产生错误:预计解码字典但会找到一个数组。

4 个答案:

答案 0 :(得分:2)

这种情况正在发生,因为decoder想要dictionary而您的JSONarray

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

如果找到Dictionary,请执行此操作

let myData = try JSONDecoder().decode(YourModel.self, from: jsonData)

如果找到Array,请执行此操作

let myData = try JSONDecoder().decode([YourModel].self, from: jsonData)

答案 1 :(得分:0)

Array类有一个方法。

使用typeof将始终返回"object"

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

const obj = {
  _array: [],
  _object: {}
}

console.log(Array.isArray(obj._array)); // true
console.log(Array.isArray(obj._object)); // false

答案 2 :(得分:0)

您可以使用try, throw之类的

来实现
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{

        }

答案 3 :(得分:0)

提供这些JSON响应的服务回复:

"clinic_info": { ... }

...是有效的JSON对象。

但是当它是空的时,你说它看起来像这样:

"clinic_info": []

请注意,[]表示这是一个空的对象数组

你可能想要更改服务响应(如果可能的话),因为它看起来不一致让它在有有效数据时返回一个对象,而在没有有效数据时返回一个数组。

您收到的错误消息很明确:

  

预计解码字典但会找到一个数组。

它期望一个对象{},但找到了一个数组[]