首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何用这个json来构造结构?

如何用这个json来构造结构?
EN

Stack Overflow用户
提问于 2022-06-21 09:24:12
回答 2查看 64关注 0票数 1

如何用这个JSON建立一个结构模型?我在youtube上看过很多教程,但我仍然很困惑,在结构上使用enum有什么意义呢?

代码语言:javascript
复制
{
  "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": []
    }
  }
}

这是我的结构模型。这一点很重要,因为我想在这个结构中使用This解码器。我想稍后再使用using解码器。

代码语言:javascript
复制
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"
        }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-06-21 13:24:23

我认为您所拥有的结构非常接近所需的内容,只是一些小的调整,例如:

代码语言:javascript
复制
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
}

像这样使用它:

代码语言:javascript
复制
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)")
            }
        }
    }
}
票数 1
EN

Stack Overflow用户

发布于 2022-06-21 09:33:49

我们使用CodingKeys,以便为JSON中的名称使用自定义名称。

例如,您有created_at,但不需要下划线,您要做的是将变量命名为createdAt,并在enum中添加case createdAt = "created_at"

至于解码部分,其实很简单:

代码语言:javascript
复制
do {
    //let data = the json data you got.
    let decoder = JSONDecoder()
    let model = try decoder.decode(jsonData.self, from: data)
}catch {
    print(String(describing: error))
}

请注意,我们在命名structs, classes, actors & enums时不使用小写字母。

编辑:感谢Marek R指出,有时JSON中的名称可以匹配特定于所用语言的关键字(即:Swift),因此实现CodingKeys是必要的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72698320

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档