Проблема с Codable и JSON - PullRequest
       28

Проблема с Codable и JSON

1 голос
/ 26 апреля 2019

Я стараюсь избегать использования всего стандартного кода без кодируемого.

Я прошу прощения, если это глупый вопрос, но почему я получаю эту ошибку, когда пытаюсь проанализировать json с кодируемым?

keyNotFound(CodingKeys(stringValue: "name", intValue: nil), Swift.DecodingError.Context(codingPath: [], debugDescription: "No value associated with key CodingKeys(stringValue: \"name\", intValue: nil) (\"name\").", underlyingError: nil))

Конечная точка json структурирована следующим образом:

{
    "businesses": [
        {
            "id": "FmGF1B-Rpsjq1f5b56qMwg",
            "alias": "molinari-delicatessen-san-francisco",
            "name": "Molinari Delicatessen",
            "image_url": "https://s3-media3.fl.yelpcdn.com/bphoto/6He-NlZrAv2mDV-yg6jW3g/o.jpg",
            "is_closed": false,
            "url": "https://www.yelp.com/biz/molinari-delicatessen-san-francisco?adjust_creative=Js10QwuboHe9ZMZF31mwuw&utm_campaign=yelp_api_v3&utm_medium=api_v3_business_search&utm_source=Js10QwuboHe9ZMZF31mwuw",
            "review_count": 1058,
            "categories": [
                {
                    "alias": "delis",
                    "title": "Delis"
                }
            ],
            "rating": 4.5,
            "coordinates": {
                "latitude": 37.79838,
                "longitude": -122.40782
            },
            "transactions": [
                "pickup",
                "delivery"
            ],
            "price": "$$",
            "location": {
                "address1": "373 Columbus Ave",
                "address2": "",
                "address3": "",
                "city": "San Francisco",
                "zip_code": "94133",
                "country": "US",
                "state": "CA",
                "display_address": [
                    "373 Columbus Ave",
                    "San Francisco, CA 94133"
                ]
            },
            "phone": "+14154212337",
            "display_phone": "(415) 421-2337",
            "distance": 1453.998141679007
        }

}

У меня есть структура, которую я создал

struct Businesses: Codable {

   var name:String
    var image_url:String
    var is_closed:Bool
    var location:[String:String]
    var display_phone:String
    var url:String

    }

Вот как я пытаюсь использовать Codable:

do{
                let jsonData = response.data

                //created the json decoder
                let decoder = JSONDecoder()

                //using the array to put values
                self.searchResults = [try decoder.decode(Businesses.self, from: jsonData!)]

1 Ответ

2 голосов
/ 26 апреля 2019

Это очень распространенная ошибка, вы игнорируете корневой объект, который - конечно - не имеет ключа name.

И вы получите еще одну ошибку, location равно не [String:String]

struct Root : Decodable {
    let businesses : [Business]
}

// Name this kind of struct in singular form

struct Business : Decodable {   
    let name: String
    let imageUrl: URL
    let isClosed: Bool
    let location: Location 
    let displayPhone: String
    let url: URL
}

struct Location : Decodable {   
    let address1, address2, address3: String
    let city, zipCode, country, state: String
    let displayAddress: [String]
}

...  

let decoder = JSONDecoder()
decoder.keyDecodingStrategy = .convertFromSnakeCase
do {
   let jsonData = response.data
   let result = try decoder.decode(Root.self, from: jsonData!)
   self.searchResults = result.businesses
} catch { print(error) }
...