【问题标题】:how to Converting JSON into Codable in swift 4.2?如何在 swift 4.2 中将 JSON 转换为 Codable?
【发布时间】:2019-07-17 10:41:42
【问题描述】:

我正在使用 Xcode 10.1 和 Swift 4.2。当我尝试将 JSON 响应转换为 Codable 类时,它会给出一个错误 Expected to decode Array<Any> but found a string/data instead.

我的实际 JSON 响应来自 API。

{
    "d": "[{\"Data\":{\"mcustomer\":[{\"slno\":1000000040.0,\"fstname\":null}]},\"Status\":true}]"
} 

我的模特是这样的

class MainData: Codable{

    var d: [SubData]

}

class SubData : Codable {


    var Data : Customer

    var Status : Bool?

}


class Customer : Codable {

    var mcustomer : [Detail]

}


class Detail : Codable {

    var slno : Double?

    var fstname : String?

}

我正在使用 JSONDecoder() 解码这个模型

let decoder = JSONDecoder()

let deco = try decoder.decode(MainData.self, from: data)

但是,我无法将此 Json 解码为我的模型。

【问题讨论】:

    标签: json swift codable


    【解决方案1】:

    您的 API 错误。你在 json 中的数组不应该有引号。否则,您将声明键 "d" 的值是字符串

    "[...]"

    [...]


    建议:

    • 变量和常量应该以小写字母开头。否则,例如您的 Data 属性会导致与 Data 类型混淆。要在解码时重命名它,您可以使用CodingKeys
    • 如果您不需要对模型进行编码,则只需实现Decodable 协议
    • 您可以在模型中使用 struct 而不是 class

    【讨论】:

    • 如果您复制该响应并在此 url 中检查它,那么您将获得所需的准确输出 freeformatter.com/json-formatter.html#ad-output
    • 我不明白 Json response is wrong 还是 My Model is wrong 。我正在尝试解析过去 2 天的这个 json,但我无法解析。
    【解决方案2】:

    顶级 JSON 对象是具有键“d”和 string 值的字典,表示另一个 JSON 对象(有时称为“嵌套 JSON”)。如果无法更改服务器 API,则必须分两步完成解码:

    • 解码顶级字典。
    • 从第一步获得的字符串中解码JSON对象。

    连同 Robert 关于命名的建议,CodingKeys 和使用 structs 看起来像这样:

    struct MainData: Codable {
        let d: String
    }
    
    struct SubData : Codable {
        let data : Customer
        let status : Bool
    
        enum CodingKeys: String, CodingKey {
            case data = "Data"
            case status = "Status"
        }
    }
    
    struct Customer : Codable {
        let mcustomer : [Detail]
    }
    
    struct Detail : Codable {
        let slno : Double
        let fstname : String?
    }
    
    do {
        let mainData = try JSONDecoder().decode(MainData.self, from: data)
        let subData = try JSONDecoder().decode([SubData].self, from: Data(mainData.d.utf8))
    
        print(subData)
    
    } catch {
        print(error)
    }
    

    【讨论】:

    • Thaks 兄弟。最后,我在 Model 中解析我的响应并建议我使用 CodingKeys Keys
    【解决方案3】:

    为了使您的解决方案正常工作,JSON 响应必须遵循以下格式

    let json = """
      {
      "d": [
        {
          "Data": {
            "mcustomer": [
              {
                "slno": 1000000040,
                "fstname": null
              }
            ]
          },
          "Status": true
        }
      ]
    }
    """
    

    但是,正如您所见,您得到的 JSON 响应与您预期的完全不同。要么您需要要求更改响应,要么您需要更改您的模型。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-13
      • 2018-04-04
      • 1970-01-01
      • 2023-03-10
      • 1970-01-01
      • 2015-01-06
      相关资源
      最近更新 更多