结构数组 - 可编码

时间:2017-12-08 05:29:07

标签: ios swift

请指示我可能重复,但在我的研究中,我无法找到解决方案。

这是我试图从我的REST API解码的JSON对象:

{
    "name": "Oak",

    "leaves":[
    {
        "id": "1A",
        "damaged": false
    },
    {
        "id": "2A",
        "damaged": false
    },
    {
        "id": "3E",
        "damaged": false
    }
]

}

以下是目前的代码:

struct Tree: Codable {
     var name : String?
     var leaves : [Leaf]?

     init() {
        self.name = string()
        self.leaves = []
     }
 }

struct Leaf: Codable {
     var id : String?
     var damaged : Bool?

     init(){
        self.id = String()
        self.damaged = Bool()
     }
}

现在当我使用API​​时,我使用以下方法解码响应:

let jsonDecoder = JSONDecoder()
let time = try jsonDecoder.decode(Tree.self, from: data)

当我尝试解码此API时,我得到:

“无法读取数据,因为格式不正确。”

感谢您提供的任何指导,谢谢!

此外,由于它们作为单例使用,因此初始化是存在的,我不是在寻找不使用单例模式的建议,我只是想找到解码的问题。

编辑:

感谢大家的回复!我认为这个问题来自于Array的自定义Struct,但它实际上更简单,我觉得很愚蠢。看看下面的答案。

再次,感谢大家的谦卑自己的指导!

1 个答案:

答案 0 :(得分:0)

对于任何在swift4数组中查看此问题的自定义Struct的人来说,这段代码确实可以正常工作。

当我问这个问题并不是问题时,我错过了数据中的参数。附加字段现在在下面,我的问题是我将日期声明为Int32?而不是Int64?。

{
    "name": "Oak",
    "discoveryDate": 1514178000000,

    "leaves":[
    {
        "id": "1A",
        "damaged": false
    },
    {
        "id": "2A",
        "damaged": false
    },
    {
        "id": "3E",
        "damaged": false
    }
]

}

哪会将结构更改为:

struct Tree: Codable {
     var name : String?
     var discoveryDate : Int64?
     var leaves : [Leaf]?

     init() {
        self.name = String()
        self.discoveryDate = Int64()
        self.leaves = []
     }
 }

struct Leaf: Codable {
     var id : String?
     var damaged : Bool?

     init(){
        self.id = String()
        self.damaged = Bool()
     }
}