skip to Main Content

I have a JSON data that I want to parse on my swift project,
JSON data:

{
            "receipt_id": 9498,
            "status": "ACCEPTED",
            "value": 100,
            "promotionName": "Kampagne ",
            "promotionId": 2062,
            "imageUrl": "https://image.png",
            "uploaded": "2022-02-22T11:58:21+0100"
        }

On my project I have this code:

struct Receipt: Decodable {
    let receiptId: Int?
    let status: ReceiptStatus
    let rejectionReason: String?
    let value: Cent?
    let promotionName: String
    let promotionId: Int
    let imageUrl: URL
    let uploaded: Date

    enum CodingKeys: String, CodingKey {
        case receiptId = "receipt_id"
        case status = "status"
        case rejectionReason = "rejectionReason"
        case value = "value"
        case promotionName = "promotionName"
        case promotionId = "promotionId"
        case imageUrl = "imageUrl"
        case uploaded = "uploaded"
    }
}

When decoding JSON data this error appears:

‘Swift.DecodingError.keyNotFound(CodingKeys(stringValue: "imageUrl", intValue: nil), Swift.DecodingError.Context(codingPath: [CodingKeys(stringValue: "receipts", intValue: nil), _JSONKey(stringValue: "Index 1", intValue: 1)], debugDescription: "No value associated with key CodingKeys(stringValue: "imageUrl", intValue: nil) ("imageUrl"), converted to image_url.", underlyingError: nil))’

On decoding the JSON data I use convertFromSnakeCase but sometimes I don’t want to follow this method for decoding so I force it inside codingKeys and that error appears

3

Answers


  1. Try this:

    struct Receipt: Codable {
        let receiptID: Int
        let status: String
        let value: Int
        let promotionName: String
        let promotionID: Int
        let imageURL: String
        let uploaded: Date
    
        enum CodingKeys: String, CodingKey {
            case receiptID = "receipt_id"
            case status, value, promotionName
            case promotionID = "promotionId"
            case imageURL = "imageUrl"
            case uploaded
        }
    }
    
    Login or Signup to reply.
  2. It’wrong is a
    let imageUrl: URL, let uploaded: Date, let status: ReceiptStatus

    Because the value of imageUrl , uploaded, status is String,
    If you using Date, URL and custom enum type of your model. Please using

    public init(from decoder: Decoder) throws
    

    to cast new type you want or you set Optional to imageUrl and uploaded, status.

    Apple Document

    Login or Signup to reply.
  3. Seems like the issue has nothing to do with the keyDecodingStrategy (convertFromSnakeCase). I think that the imageUrl is not a required field in your JSON and can be equal to null or even miss sometimes. Making the imageUrl property in your struct optional will fix the problem.

    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search