Swift Codable解码JSON中没有键的数组

问题描述

我正在使用一个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]
}

祝你好运!