Search code examples
iosjsonswiftstruct

How to make struct with this JSON?


How to make a struct model with this JSON? I've watched many tutorials on YouTube but I'm still confused, and what's the meaning of using enum on struct?

{
  "err_code": 0,
  "data": {
    "message": "Success",
    "result": {
      "check_in": [
        {
          "created_at": "2022-06-20 10:00:37",
          "late": "True",
          "location": "Jl. H. Asmawi No.63, Beji, Kecamatan Beji, Kota Depok, Jawa Barat 16421, Indonesia",
          "place": "GRIT OFFICE",
          "folder": "./pegawai/grit/2022/06/20/masuk/10/00/",
          "filename": "0000_rakha_fatih_athallah_picture.jpg",
          "tujuan": "",
          "link": "http://103.140.90.10:8081/face-recognition/client/python/pegawai/grit/2022/06/20/masuk/10/00/0000_rakha_fatih_athallah_picture.jpg"
        },
        {
          "created_at": "2022-06-16 11:23:12",
          "late": "True",
          "location": "Jl. H. Asmawi No.63, Beji, Kecamatan Beji, Kota Depok, Jawa Barat 16421, Indonesia",
          "place": "GRIT OFFICE",
          "folder": "./pegawai/grit/2022/06/16/masuk/11/23/",
          "filename": "0000_rakha_fatih_athallah_picture.jpg",
          "tujuan": "",
          "link": "http://103.140.90.10:8081/face-recognition/client/python/pegawai/grit/2022/06/16/masuk/11/23/0000_rakha_fatih_athallah_picture.jpg"
        }
      ],
      "check_out": []
    }
  }
}

And this is my struct model. This is important because I want to use jsondecoder with this struct. I want using jsondecoder later.

import Foundation

struct jsonData : Codable{
    var err_code : Int
    var data : Data
    
    enum CodingKeys: String, CodingKey {
            case err_code = "err_code"
            case data = "data"
        }
}

struct Data: Codable{
    var message : String
    var result  : Result
}

struct Result : Codable {
    var check_in  : [Checkin] = []
}

struct Checkin : Codable{
    var created_at : String
    var late : String
    var location : String
    var place : String
    var folder : String
    var tujuan : String
    var link : String
    
    enum CodingKeys: String, CodingKey {
            case created_at = "created_at"
            case late = "late"
            case location = "location"
            case place = "place"
            case folder = "folder"
            case tujuan = "tujuan"
            case link = "link"
        }
}

Solution

  • I think the structs you have are very close to what is required, just minor tweaks such as:

    struct Response: Codable{
        var err_code: Int
        var data: DataObj
    }
    
    struct DataObj: Codable{
        var message: String
        var result: Result
    }
    
    struct Result: Codable {
        var check_in: [Checkin]
    }
    
    struct Checkin: Codable, Hashable {
        var created_at: String
        var late: String
        var location: String
        var place: String
        var folder: String
        var tujuan: String
        var link: String
    }
    

    Use it like this:

    struct ContentView: View {
        @State var apiResponse: Response?
        
        var body: some View {
            VStack {
                if let response = apiResponse {
                    Text("message: \(response.data.message) ")
                    Text("check_in.count: \(response.data.result.check_in.count) ")
                List {
                    ForEach(response.data.result.check_in, id: \.self) { chk in
                        Text("created_at: \(chk.created_at) ")
                    }
                }
                }
            }
            .onAppear {
                let jsonStr = """
                     {
                     "err_code": 0,
                     "data": {
                     "message": "Success",
                     "result": {
                     "check_in": [
                     {
                     "created_at": "2022-06-20 10:00:37",
                     "late": "True",
                     "location": "Jl. H. Asmawi No.63, Beji, Kecamatan Beji, Kota Depok, Jawa Barat 16421, Indonesia",
                     "place": "GRIT OFFICE",
                     "folder": "./pegawai/grit/2022/06/20/masuk/10/00/",
                     "filename": "0000_rakha_fatih_athallah_picture.jpg",
                     "tujuan": "",
                     "link": "http://103.140.90.10:8081/face-recognition/client/python/pegawai/grit/2022/06/20/masuk/10/00/0000_rakha_fatih_athallah_picture.jpg"
                     },
                     {
                     "created_at": "2022-06-16 11:23:12",
                     "late": "True",
                     "location": "Jl. H. Asmawi No.63, Beji, Kecamatan Beji, Kota Depok, Jawa Barat 16421, Indonesia",
                     "place": "GRIT OFFICE",
                     "folder": "./pegawai/grit/2022/06/16/masuk/11/23/",
                     "filename": "0000_rakha_fatih_athallah_picture.jpg",
                     "tujuan": "",
                     "link": "http://103.140.90.10:8081/face-recognition/client/python/pegawai/grit/2022/06/16/masuk/11/23/0000_rakha_fatih_athallah_picture.jpg"
                     }
                     ],
                     "check_out": []
                     }
                     }
                     }
                     """
                // simulated response data
                let data = jsonStr.data(using: .utf8)!
                do {
                    self.apiResponse = try JSONDecoder().decode(Response.self, from: data)
                    print("\n---> apiResponse \(apiResponse)")
                }
                catch {
                    print(" error \(error)")
                }
            }
        }
    }