Panos2310
Panos2310

Reputation: 15

JSON decoding in swift to a struct

I have to decode this JSON to a Swift struct:

[
  {
    "uuid": "14ba04ec-0447-4e98-92ae-904d25202b09",
    "customer-uuid": "8e1fc598-2d58-4ae9-b4cc-62364a0c6ce3",
    "name": "Λουκουμάδες",
    "original-name": "Λουκουμάδες",
    "description": "Συνταγή για λουκουμάδες από τον Άκη Πετρετζίκη. Κλασικοί λουκουμάδες με μέλι, σουσάμι και κανέλα. Ιδανικοί για σνακ και για παιδικά πάρτυ! Θα ενθουσιαστείτε!",
    "original-description": "Συνταγή για λουκουμάδες από τον Άκη Πετρετζίκη. Κλασικοί λουκουμάδες με μέλι, σουσάμι και κανέλα. Ιδανικοί για σνακ και για παιδικά πάρτυ! Θα ενθουσιαστείτε!",
    "images": [      "https://d3fch0cwivr6nf.cloudfront.net/system/uploads/medium/data/15195/recipe_main_loukoumades-site.jpg"
    ],
    "new-images": [
      {
        "width": 2480,
        "height": 3402,
        "type": "jpg",
        "mime": "image/jpeg",
        "wUnits": "px",
        "hUnits": "px",
        "length": 1493125,
        "url": "https://d3fch0cwivr6nf.cloudfront.net/system/uploads/medium/data/15089/COVER_AKHS_T11_8862_metallic_Fin2.jpg"
      },
       {
        "width": 1,
        "height": 1,
        "type": "gif",
        "mime": "image/gif",
        "wUnits": "px",
        "hUnits": "px",
        "length": 44,
        "url": "https://www.facebook.com/tr?id=507576426720164\u0026ev=PageView%0A\u0026noscript=1"
      }
    ],
    "ingredients": [
      "250 ml νερό",
      "200 γρ. ζάχαρη κρυσταλλική",
      "1 φέτα λεμόνι",
      "1 κ.σ. μέλι",
      "280 ml νερό, σε θερμοκρασία δωματίου",
      "κανέλα",
      "μέλι"
    ],
    "original-ingredients": [
      "250 ml νερό",
      "μέλι"
    ],
    "instructions": [
      {
        "steps": [
          "Δείτε το βίντεο στη νοηματική εδώ.",
          "Ξεκινάμε με το σιρόπι μιας και πρέπει να είναι κρύο όταν ρίξουμε μέσα τους λουκουμάδες. Βάζουμε τη ζάχαρη, το νερό το λεμόνι και το μέλι σε μία κατσαρόλα και φέρνουμε σε βρασμό. Αποσύρουμε από τη φωτιά και μεταφέρουμε σε άλλο σκεύος για να κρυώσει πιο γρήγορα.",
          "Πασπαλίζουμε με κανέλα και σπόρους σουσαμιού."
        ]
      }
    ],
    "original-instructions": [
      {
        "steps": [
          "Δείτε το βίντεο στη νοηματική εδώ.",
          "Όταν το λάδι έχει φτάσει στην κατάλληλη θερμοκρασία βάζουμε το χέρι μας στο μπολ με τη ζύμη, παίρνουμε ζύμη με το χέρι μας και αρχίζουμε να την κλείνουμε μέσα στο χέρι μας. Αυτή ξεκινά να ξεχειλίζει ανάμεσα από τον δείκτη και τον αντίχειρα. Έχουμε το κουταλάκι στο άλλο χέρι και με αυτό παίρνουμε κουταλιές από τη ζύμη τις οποίες αφήνω να πέσουν μέσα στο τηγάνι.",
          "Πασπαλίζουμε με κανέλα και σπόρους σουσαμιού."
        ]
      }
    ],
    "yield": "4",
    "original-yield": "4",
    "prep-time": "PT20M",
    "original-prep-time": "PT20M",
    "cook-time": "PT10M",
    "original-cook-time": "PT10M",
    "total-time": "",
    "url": "https://akispetretzikis.com/el/categories/glyka/loykoymades",
    "created": "2021-02-22T10:17:03.338776+00:00",
    "created-by": "RapidAPI",
    "updated": "2021-02-22T10:17:03.338776+00:00"
  }
]

The struct I have created is this:

struct RecipeParsedJSON : Content {
    var uuid : String?
    var customer_uuid : String?
    var name : String?
    var original_name : String?
    var description : String?
    var original_description : String?
    var images : [String]?
    var new_images : [New_images]?
    var new_original_images : [New_original_images]?
    var ingredients : [String]?
    var original_ingredients : [String]?
    var instructions : [Instructions]?
    var original_instructions : [Original_instructions]?
    var yield : String?
    var original_yield : String?
    var prep_time : String?
    var original_prep_time : String?
    var cook_time : String?
    var original_cook_time : String?
    var total_time : String?
    var url : String?
    var created : String?
    var created_by : String?
    var updated : String?
}

struct Instructions : Content {
    var steps : [String]?
}

struct New_images : Content {
    var width : Int?
    var height : Int?
    var type : String?
    var mime : String?
    var wUnits : String?
    var hUnits : String?
    var length : Int?
    var url : String?
}

struct New_original_images : Content {
    var width : Int?
    var height : Int?
    var type : String?
    var mime : String?
    var wUnits : String?
    var hUnits : String?
    var length : Int?
    var url : String?
    }

struct Original_instructions : Content {
    var steps : [String]?
}

I can get the decode going with

let result = try JSONSerialization.jsonObject(with: data!, options: .allowFragments)

but when I use this:

let result = try JSONDecoder().decode(RecipeParsedJSON.self, from: data!)

I get a type error. (The data couldn’t be read because it isn’t in the correct format.)

I cannot find a way to pinpoint the error (in order to correct the struct format)

Upvotes: 1

Views: 76

Answers (1)

πter
πter

Reputation: 2217

You are parsing your response as a single object of a RecipeParsedJSON, but it is an array. Instead of:

let result = try JSONDecoder().decode(RecipeParsedJSON.self, from: data!)

Try to do:

do {
    try let result =  JSONDecoder().decode([RecipeParsedJSON].self, from: data)
    print(result)
} catch {
    print("Parsing error:", error)
}

Added a docatch block also, so now you can identify your issue more easily.

Upvotes: 2

Related Questions