Convert Key Pairs Array To Struct

I have a key pairs array:

["Id": XmGjU9gxS5s0CzP4S6-bHw, "Name": Pizzeria La Rocca, "Url": https://www.yelp.com/biz/pizzeria-la-rocca-seattle?adjust_creative=sxCnBn1t8D3B-4MLGRB_2g&utm_campaign=yelp_api_v3&utm_medium=api_v3_business_search&utm_source=sxCnBn1t8D3B-4MLGRB_2g, "Rating": 5, "Img": https://s3-media1.fl.yelpcdn.com/bphoto/kE6hbIfi4WdlIW52SF5KUw/o.jpg]

How do I convert this to my struct?

struct RestaurantListViewModel: Identifiable {

    let name: String

    let imageUrl: URL

    let id: String

    let rating: Double

    let url: String

//    let category: Array<String>

}

Thank you in advanced!

Accepted Answer

It is not JSON, so not as easy (thanks to JSONDecoder).

Are you sure Pizzeria La Rocca is not in quotes "Pizzeria La Rocca", idem for XmGjU9gxS5s0CzP4S6-bHw or url ?

A simple way to do this (with the quotes):

// I adapted the input
let input : [String: Any] = ["Id": "XmGjU9gxS5s0CzP4S6-bHw", "Name": "Pizzeria La Rocca", "Url": "https://www.yelp.com/biz/pizzeria-la-rocca-seattle?adjust_creative=sxCnBn1t8D3B-4MLGRB_2g&utm_campaign=yelp_api_v3&utm_medium=api_v3_business_search&utm_source=sxCnBn1t8D3B-4MLGRB_2g", "Rating": 5.0, "Img": "https://s3-media1.fl.yelpcdn.com/bphoto/kE6hbIfi4WdlIW52SF5KUw/o.jpg"]
//How do I convert this to my struct?

struct RestaurantListViewModel: Identifiable {
    var name: String
    var imageUrl: URL?
    var id: String
    var rating: Double
    var url: String        // Why a string here ?
//    let category: Array<String>
}

Then use as follows:

          var restaurant = RestaurantListViewModel(name: "", imageUrl: nil, id: "", rating: 0.0, url: "")
          for (key, value) in input {
              switch key {
              case "Name"     : restaurant.name = value as? String ?? ""
              case "Img"      : restaurant.imageUrl = URL(string: (value as? String ?? ""))
              case "Id"       : restaurant.id = value as? String ?? ""
              case "Rating"   : restaurant.rating = value as? Double ?? 0.0
              case "Url"      : restaurant.url = value as? String ?? ""
              default: break
              }
          }

          print(restaurant)

And get:

RestaurantListViewModel(name: "Pizzeria La Rocca", imageUrl: Optional(https://s3-media1.fl.yelpcdn.com/bphoto/kE6hbIfi4WdlIW52SF5KUw/o.jpg), id: "XmGjU9gxS5s0CzP4S6-bHw", rating: 0.0, url: "https://www.yelp.com/biz/pizzeria-la-rocca-seattle?adjust_creative=sxCnBn1t8D3B-4MLGRB_2g&utm_campaign=yelp_api_v3&utm_medium=api_v3_business_search&utm_source=sxCnBn1t8D3B-4MLGRB_2g")

You can also do this in an init in struct

struct RestaurantListViewModel: Identifiable {
    var name: String
    var imageUrl: URL?
    var id: String
    var rating: Double
    var url: String        // Why a string here ?
//    let category: Array<String>

     init(from dictionary: [String: Any]) {
              self.name = dictionary["Name"] as? String ?? ""
              self.imageUrl = URL(string: (dictionary["Img"] as? String ?? ""))
              self.id = dictionary["Id"] as? String ?? ""
              self.rating = dictionary["Rating"] as? Double ?? 0.0
             self.url = dictionary["Url"] as? String ?? ""
    }
}

And use :

          let input : [String: Any] = ["Id": "XmGjU9gxS5s0CzP4S6-bHw", "Name": "Pizzeria La Rocca", "Url": "https://www.yelp.com/biz/pizzeria-la-rocca-seattle?adjust_creative=sxCnBn1t8D3B-4MLGRB_2g&utm_campaign=yelp_api_v3&utm_medium=api_v3_business_search&utm_source=sxCnBn1t8D3B-4MLGRB_2g", "Rating": 5.0, "Img": "https://s3-media1.fl.yelpcdn.com/bphoto/kE6hbIfi4WdlIW52SF5KUw/o.jpg"]
          let restaurant = RestaurantListViewModel(from:input)

Convert Key Pairs Array To Struct
 
 
Q