【问题标题】:Issue parsing JSON not in array format解析 JSON 不是数组格式的问题
【发布时间】:2021-01-27 04:27:53
【问题描述】:

基本上我想采用以下 JSON 并在我的项目中使用数据。

为了解析数据,我需要创建一个结构 - 过去我将它用于数组:

结构:

struct ArrayStruct: Codable {
    let info1: String
    let info2: String
}

数组:

[
  {
    "info1": "Information",
    "info2": "More"
  }
]

以下数据的结构是什么样的?

{
  "error": false,
  "response": "",
  "message": "",
  "general": {
    "customer": "Customer1",
    "code": "CO1234",
    "name": "Machine Name",
    "category": "machine"
  },
  "details": {
    "taken": "July 15th 2020",
    "created": "November 2nd 2020",
    "packed": "",
    "delivered": ""
  }
}

【问题讨论】:

  • 你肯定尝试过什么?

标签: json swift swift5


【解决方案1】:

我使用 struct 为您提供的数据创建了一个结构

struct MainResponse : Codable {
    let details : Detail?
    let error : Bool?
    let general : General?
    let message : String?
    let response : String?

    // coding keys not required for this as the data keys are same but added just as an example
    
    enum CodingKeys: String, CodingKey {
        case details = "details"
        case error = "error"
        case general = "general"
        case message = "message"
        case response = "response"
    }
}

struct Detail : Codable {
    let created : String?
    let delivered : String?
    let packed : String?
    let taken : String?
}

struct General : Codable {
    let category : String?
    let code : String?
    let customer : String?
    let name : String?
}

【讨论】:

  • 为什么每个属性都是可选的?除非实际上可以设置为 nil,否则不应将任何内容设为可选。
  • 可能会有一些值为零,但如果你确定你不会得到任何零值,那么你可以强制解包
  • 与一开始就有正确的设计相比,这是个坏主意。
【解决方案2】:

首先你需要像这样创建你的数据结构

struct MainResponse : Codable {
   let error : Bool?
   let response : String?
   let message : String?
   let general : General?
   let details : Details?
}

像这样制作你的通用结构

struct General : Codable {
   let customer : String?
   let code : String?
   let name : String?
   let category : String?
}

像这样制作你的细节结构

struct Details : Codable {
   let taken : String?
   let created : String?
   let packed : String?
   let delivered : String?
}

【讨论】:

  • 数据是关键字。数据应该是 RespData 或其他的东西
【解决方案3】:

现在很容易创建结构,有各种各样的工具可用,只需输入响应您将获得数据结构,使用以下生成结构

quicktype.io

    // MARK: - Customer
struct Customer: Codable {
    let error: Bool?
    let response, message: String?
    let general: General?
    let details: Details?
}

// MARK: - Details
struct Details: Codable {
    let taken, created, packed, delivered: String?
}

// MARK: - General
struct General: Codable {
    let customer, code, name, category: String?
}

【讨论】:

    猜你喜欢
    • 2015-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多