-1

I am trying to use Codeable for the following response from the API

{
    "id": "1",
    "name": "Demo 1",
    "description": "Description 1",
    "created": "2020-04-12T17:20:32.687628Z",
    "creator": {
        "id": 10,
        "name": "My User",
        "image": null
    },
    "images": [],
    "allergens": []
}

This is my code

struct MyObject: Codable {
        let id: Int
        let name, description, created: String
        let images, allergens: [String]
        let creator: [String: Any]?
    }

I want have Codable struct for my example API object. I have another object in main object. How can I solve this problem in Swift with struct and Codable?

Bob
  • 8,392
  • 12
  • 55
  • 96

2 Answers2

0

Maybe something like this:

struct MyObject: Codable {
    let id, name, description, created: String
    let creator: Creator
    let images, allergens: [JSONAny] //Choose perfect type

}

struct Creator: Codable {
    let id: Int
    let name: String
    let image: String
}
dawis11
  • 820
  • 1
  • 9
  • 24
0

You can create struct for Creator or custom decoder like this:

struct MyObject: Decodable {
    let id: String
    let name, description, created: String
    let images, allergens: [String]
    let creatorId: Int
    let creatorName: String

    enum CodingKeys: String, CodingKey {
        case id, name, description, created, images, allergens, creator
    }

    enum CreatorKeys: String, CodingKey {
        case creatorId = "id"
        case creatorName = "name"
    }

    init(from decoder: Decoder) throws {
        let values = try decoder.container(keyedBy: CodingKeys.self)
        id = try values.decode(String.self, forKey: .id)
        name = try values.decode(String.self, forKey: .name)
        description = try values.decode(String.self, forKey: .description)
        created = try values.decode(String.self, forKey: .created)
        images = try values.decode([String].self, forKey: .images)
        allergens = try values.decode([String].self, forKey: .allergens)

        let creatorContainer = try values.nestedContainer(keyedBy: CreatorKeys.self, forKey: .creator)

        creatorId = try creatorContainer.decode(Int.self, forKey: .creatorId)
        creatorName = try creatorContainer.decode(String.self, forKey: .creatorName)
    }
}

let decodedJSon = try JSONDecoder().decode(MyObject.self, from: json.data(using: .utf8)!)
Onvil
  • 46
  • 3