WWDC23 SALE: Save 50% on all my Swift books and bundles! >>

SOLVED: Problems figuring out how to define a Decode struct for a complex JSON

Forums > Swift

Hello!

Looking for advise after staring at this problem for half a day.

I have a complex JSON thats returned by an API and I need to create the decode Struct but i'm having difficulties.

I invested in Ducky as I thought that would generate the Struct for me, but the generated code is throwing a whole bunch of errors.

Below is the first 50 lines of the generate Struct. I'm getting the error: Type 'Ab.Result.Action' does not conform to protocol 'Decodable' on line 5 and then on every following Struct line. So i'm assuming that there is a core issue that needs to be fixed but I dont understand what the error means. Below is just a sample this goes of for another 1000 lines.

Also screenshot here:

https://imgur.com/a/wXWNvT3

Any advise greatly appriciated, I was kinda hoping Ducky would be me saviour, but in this case sadly not.

Thank you!!

import Foundation

struct Ab: Codable {
  struct Result: Codable {
    struct Action: Codable {
      struct Criterium: Codable {
        var name: String
        var relevance: String
        var verbose: String
        var searchEngine: String?

        private enum CodingKeys: String, CodingKey {
          case name
          case relevance
          case verbose
          case searchEngine = "search_engine"
        }
      }

      struct Metric: Codable {
        struct TotalURL: Codable {
          var count: Int
          var percentage: Double
          var percentageInScope: Double
          var previousCount: Any?
          var previousPercentageInScope: Any?
          var previousPercentage: Any?

          private enum CodingKeys: String, CodingKey {
            case count
            case percentage
            case percentageInScope = "percentage_in_scope"
            case previousCount = "previous_count"
            case previousPercentageInScope = "previous_percentage_in_scope"
            case previousPercentage = "previous_percentage"
          }
        }

        struct TotalUrlsInScope: Codable {
          var count: Int
          var percentage: Double
          var previousPercentage: Any?
          var previousCount: Any?

          private enum CodingKeys: String, CodingKey {
            case count
            case percentage
            case previousPercentage = "previous_percentage"
            case previousCount = "previous_count"
          }
        }

   

Hi! I suspect the problem in this type of lines.

 var previousCount: Any?

I doubt that Any is encodable/decodable, well logically, how decoder is supposed to know how to process Any data type...

   

@ygeras That seems to be it, thank you! Wonder why Ducky feels that Any should be included if it's nor Decodeable? Thanks again!

   

When you pasted theJSON into ~Ducky~ those field had no data in them but had keys so it put Any there for you to change if you do not know then you should delete them or comment out then only use them once you find the types.

You also used CodingKeys I would change the option in Ducky's Property Naming Style to Snake to Carmel and then add

let decoder = JSONDecoder()
decoder.keyDecodingStrategy = .convertFromSnakeCase

It make the struct less cluttered

   

Thank you Nigel, i'll take that advise. I don't need the fields in question.

   

Save 50% in my WWDC23 sale.

SAVE 50% To celebrate WWDC23, all our books and bundles are half price, so you can take your Swift knowledge further without spending big! Get the Swift Power Pack to build your iOS career faster, get the Swift Platform Pack to builds apps for macOS, watchOS, and beyond, or get the Swift Plus Pack to learn advanced design patterns, testing skills, and more.

Save 50% on all our books and bundles!

Reply to this topic…

You need to create an account or log in to reply.

All interactions here are governed by our code of conduct.

 
Unknown user

You are not logged in

Log in or create account
 

Link copied to your pasteboard.