我在 Swift 5 上解码 json 时出错

Posted

技术标签:

【中文标题】我在 Swift 5 上解码 json 时出错【英文标题】:I have an error on decode a json on Swift 5 【发布时间】:2019-11-14 07:37:43 【问题描述】:

我尝试解析我的后端团队制作的 json。但是 json 有点奇怪,我不能要求后端团队更改 json。所以这里是json:


"nama": [
    "Tigor Franky",
    "Achmad Fauzi",
    "Mario David Lela Muda",
    "Mily Anggreini Hutasuhut",
    "Arif Fahmi ST",
    "Satwika Narindra Dhipa",
    "Mujib Burahman",
    "Aresty Puji Harjanty",
    "Rio Jatmiko",
    "Halasson Sitanggang"
],
"u_id": [
    196,
    113,
    114,
    149,
    115,
    116,
    117,
    118,
    119,
    120
],
"totalakhir": [
    14.15,
    1.74,
    1.25,
    0.75,
    0,
    0,
    0,
    0,
    0,
    0
   ]
 

所以,这对我来说是新的。我该如何解码?

到目前为止,我尝试了这个,但是有一个错误说

"typeMismatch(Swift.Dictionary, Swift.DecodingError.Context(codingPath: [CodingKeys(stringValue: "nama", intValue: nil), _JSONKey(stringValue: "Index 0", intValue: 0)], debugDescription: "应解码字典,但找到了一个字符串/数据。",基础错误:nil))"

我尝试做一个这样的结构:

struct HOF : Codable 
let nama : [Nama]
let u_id : [U_Id]
let totalakhir : [TotalAkhir]


struct Nama : Codable 
let namaa : String

enum CodingKeys : String, CodingKey 
    case namaa = "nama"
   


struct U_Id : Codable 
let u_idd : Int

enum CodingKeys : String, CodingKey 
    case u_idd = "u_id"
   

我知道我在制作结构时错了,但我只是不知道如何制作结构。

【问题讨论】:

“嵌套结构”是错误的。将let nama : [Nama] 替换为let nama : [String]struct HOF 的其他属性类似。 告诉你的后端团队,发送字典比发送多个数组更有效,即使发送的数据量有点高。 将此json响应复制到app.quicktype.io,它将自动创建结构。试一次 【参考方案1】:

structHOF改成这个,去掉其他数据类型,

struct HOF : Codable 
    let nama : [String]
    let u_id : [Int]
    let totalakhir : [Decimal]


似乎列表与同一个用户有关,所以我建议让您的后端更改 json 结构,如下所示,


"hof": [
    
      "nama": "Tigor Franky",
      "u_id": 196,
      "totalakhir": 14.15
    ,
    
      "nama": "Mily Anggreini Hutasuhut",
      "u_id": 113,
      "totalakhir": 1.74
    
 ]

所以,你的数据类型会变成这个,

struct HofUser : Codable 
    let nama : String
    let u_id : Int
    let totalakhir : Decimal


struct Response : Codable 
    let hof : [HofUser]

这将允许您只有一个列表,其中每个元素都包含与特定用户相关的所有信息。

【讨论】:

好的,谢谢你的回答,我试着让我的后端改变它,但直到现在还没有结果,但感谢它为我工作【参考方案2】:

因为 String IntDouble 是 Codable 类型。 因此,Codable 类型的数组将与 Codable 一起使用。

所以没有必要为 U_IdNama 制作类型

您可以按照以下代码所示制作模型。 Codable 将为您完成剩下的工作。 您可以在 Playground 中运行此示例并查看解码后的输出。

import Foundation

let json = """

"nama": [
    "Tigor Franky",
    "Achmad Fauzi",
    "Mario David Lela Muda",
    "Mily Anggreini Hutasuhut",
    "Arif Fahmi ST",
    "Satwika Narindra Dhipa",
    "Mujib Burahman",
    "Aresty Puji Harjanty",
    "Rio Jatmiko",
    "Halasson Sitanggang"
],
"u_id": [
    196,
    113,
    114,
    149,
    115,
    116,
    117,
    118,
    119,
    120
],
"totalakhir": [
    14.15,
    1.74,
    1.25,
    0.75,
    0,
    0,
    0,
    0,
    0,
    0
   ]
 
""".data(using: .utf8)!

struct DataModel: Codable 
    let nama: [String]
    let uId: [Int]
    let totalakhir: [Double]
    private enum CodingKeys: String, CodingKey 
        case nama
        case uId = "u_id"
        case totalakhir
    


let em1 = try JSONDecoder().decode(DataModel.self, from:json)

print(em1)

【讨论】:

以上是关于我在 Swift 5 上解码 json 时出错的主要内容,如果未能解决你的问题,请参考以下文章

JSON解码时出错:Swift.DecodingError.keyNotFound(CodingKeys(stringValue:“cast”,intValue:nil)

Apollo graphQL:在 iOS swift 中使用自定义标量时解码数组时出错

使用 Alamofire 解码 json 时出错

尝试从 Swift 2.0 中的 json 解析数据时出错?

如何在 swift 4.1 和 xcode 9.3 中使用 JSONDecoder 解码嵌套的 JSON 数组和对象?

将 json 和 HTTP“post”代码转换为 Swift 3 时出错