Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Json 如果两种数据类型中的一种总是空的,那么如何在两种数据类型中解码可编码属性?_Json_Swift_Swift4_Decode_Decodable - Fatal编程技术网

Json 如果两种数据类型中的一种总是空的,那么如何在两种数据类型中解码可编码属性?

Json 如果两种数据类型中的一种总是空的,那么如何在两种数据类型中解码可编码属性?,json,swift,swift4,decode,decodable,Json,Swift,Swift4,Decode,Decodable,我收到一个post请求,这个JSON: "clinic_info": { "city": "Querétaro", "state": "Querétaro", "country": "México", "phone": null, "ext": null, "coords": "20.6046089,-10

我收到一个post请求,这个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": []

这会产生一个错误:应该解码字典,但却找到了一个数组。

发生这种情况是因为
decoder
想要
Dictionary
,而您的
JSON
array

解码之前需要检查
JSON
响应是否为
dictionary
Array
,并相应地执行
解码

如果你找到
字典
,那么就这样做

let myData = try JSONDecoder().decode(YourModel.self, from: jsonData)
let myData = try JSONDecoder().decode([YourModel].self, from: jsonData)
如果您找到
数组
,请执行以下操作

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

Array
类有一个用于此的方法

使用
typeof
将始终返回
“对象”

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

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

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

你可以像那样使用
试试,扔

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{

        }

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

"clinic_info": { ... }
其中,
是有效的JSON对象

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

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

您可能希望更改服务响应(如果可能的话),因为在我看来,当它有有效数据时返回一个对象,当没有有效数据时返回一个数组,这看起来不一致

您收到的错误消息很清楚:

应解码字典,但找到了数组


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

@Christian4423:谢谢,已更新