问题描述
我有一堂课,下一堂课
import UIKit
final class PruebaModel: Codable {
let a: String?
let b: String?
let c: [D]?
let f: String?
enum CodingKeys: String,CodingKey {
case a = "a"
case b = "b"
case c = "c"
case f = "f"
}
required init(from decoder: Decoder) throws {
let values = try decoder.container(keyedBy: CodingKeys.self)
a = try values.decodeIfPresent(String.self,forKey: .a)
b = try values.decodeIfPresent(String.self,forKey: .b)
c = try values.decodeIfPresent([D].self,forKey: .c)
f = try values.decodeIfPresent(String.self,forKey: .f)
}
required init() {
a = ""
b = ""
c = Array<D>()
f = ""
}
}
import Foundation
struct D: Codable {
let l: String
let m: String
enum CodingKeys: String,CodingKey {
case l = "l"
case m = "m"
}
init(from decoder: Decoder) throws {
let value = try decoder.container(keyedBy: CodingKeys.self)
l = try value.decode(String.self,forKey: .l)
m = try value.decode(String.self,forKey: .m)
}
public func encode(to encoder: Encoder) throws {
//Implement when needed
}
}
json是下一个
{
"a": "a","b": "b","c": [
{
"l": "¿Cuál es el mi color favorito?","m":"QAUY.15"
}
],"f": "f"
}
该类是完美的,它具有带参数的对象,但是当我尝试将其转换为json时。数组为空
代码
let jsonData = try! JSONEncoder().encode(PruebaModel)
let jsonString = String(data: jsonData,encoding: .utf8)!
当我评估表达式时的结果
po String(data: try! JSONEncoder().encode(PruebaModel),encoding: .utf8)!
“ {” a“:” a“,” b“:” b“,” c“:[{}],” f“:” f“}”
为什么c为空?它在数组内部有一个对象。
如果对象在数组内部没有特殊字符,则解码将显示该对象
解决方法
不清楚您要问什么。一方面,您有太多的代码。另外,您显示的代码没有任何意义。另一方面,您显示的JSON可以很好地解码为PruebaModel,正确构造的PruebaModel可以编码为您的JSON:
struct D: Codable {
let l: String
let m: String
}
struct PruebaModel: Codable {
let a: String?
let b: String?
let c: [D]?
let f: String?
}
let jsonString = """
{
"a": "a","b": "b","c": [
{
"l": "¿Cuál es el mi color favorito?","m":"QAUY.15"
}
],"f": "f"
}
"""
let jsonData = jsonString.data(using: .utf8)!
let result = try? JSONDecoder().decode(PruebaModel.self,from: jsonData)
print(result?.c?.first?.l) // Optional("¿Cuál es el mi color favorito?")
// let's also try encoding
let d = D(l: "¿Cuál es el mi color favorito?",m: "QAUY.15")
let myPruebaModel = PruebaModel(a: "a",b: "b",c: [d],f: "f")
let jsonData2 = try? JSONEncoder().encode(myPruebaModel)
print(String(data: jsonData2!,encoding: .utf8)!)
// {"b":"b","c":[{"l":"¿Cuál es el mi color favorito?","m":"QAUY.15"}],"a":"a","f":"f"}