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