问题描述
我正在使用一个API,该API返回这个非常糟糕的JSON:
Fatal error: Call to undefined function oci_connect()
我正在尝试使用JSONDecoder解码嵌套的数组,但是它没有单个键,而且我真的不知道从哪里开始……你有什么主意吗?
{
"error":false,"country":"USA","country_id":"881","operator":"Operatp","operator_id":"2053","logo":"https://logo-2053-1.png","destination_currency":"USD","product_list":[
"10","20","50","100","200","500"
],"product_options":[
{
"10 RUB":"\u0026dollar;1.00 USD"
},{
"20 RUB":"\u0026dollar;2.00 USD"
},{
"50 RUB":"\u0026dollar;5.00 USD"
},{
"100 RUB":"\u0026dollar;9.99 USD"
},{
"200 RUB":"\u0026dollar;19.98 USD"
},{
"500 RUB":"\u0026dollar;49.95 USD"
}
]
}
我得到的错误
let test = try JSONDecoder().decode(Options.self,from: data!)
for options in test.options {
print(options)
}
struct Options : Decodable {
let options : [String]
}
非常感谢!
解决方法
免责声明-我写此答案的那一刻,问题就不同了。 作者可能已经修改了
所以您的回复如下:
{
"options": [
{
"A" = "A"
},{
"B" = "B"
},{
"C" = "C"
}
]
}
JSON解码器所做的只是尝试将响应映射到预布局的Codable / Decodable结构。而且您越具体,验证就越具体。而且由于Swift是类型安全的,因此您必须提防数据类型。
因此,在您的情况下,您的响应如下:
1-带有一个键“ options”的字典,它是一组东西
struct Options : Codable {
let options : [Data]
}
2-“选项”是键值字典(或对象)的数组
typealias ElementType = [String: Data]
struct Options : Codable {
let options : [ElementType]
}
3-每个字典都有字符串键和字符串值
typealias ElementType = [String: String]
struct Options : Codable {
let options : [ElementType]
}
4-(更进一步)-如果您已经知道要获得的键名(A,B,C)
您可以使用这样的可选参数创建对象。
因此,将使用正确的键值对填充每个对象,剩下的nil
struct MyObject : Codable {
let A : String?
let B : String?
let C : String?
}
struct Options : Codable {
let options : [MyObject]
}
5-(奖金)通常用于快速样式指南,变量名保持小写,因此,如果要映射自定义变量名,则可以这样做
struct MyObject : Codable {
let customName1 : String?
let customName2 : String?
let C : String?
enum CodingKeys: String,CodingKey {
case customName1 = "A" // put whatever in 'A' inside 'customName1'
case customName2 = "B"
// default
case C
}
}
struct Options : Codable {
let options : [MyObject]
}
祝你好运!