Codable和JSON问题

时间:2019-04-26 18:59:06

标签: json swift codable jsonparser

我试图避免使用所有没有编码的样板代码。

我很抱歉这是一个愚蠢的问题,但是当我尝试使用可编码的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 个答案:

答案 0 :(得分:2)

这是一个非常常见的错误,您忽略了根对象-当然,该根对象没有键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) }