我在 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】:
把struct
HOF
改成这个,去掉其他数据类型,
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 Int 和 Double 是 Codable 类型。 因此,Codable 类型的数组将与 Codable 一起使用。
所以没有必要为 U_Id 或 Nama 制作类型
您可以按照以下代码所示制作模型。 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 中使用自定义标量时解码数组时出错
尝试从 Swift 2.0 中的 json 解析数据时出错?