【问题标题】:How to construct struct based on json如何基于json构造struct
【发布时间】:2019-05-21 20:06:06
【问题描述】:

我根据我创建的结构列出了 Json 结果,但在解析时出现错误类型不匹配。在代码中创建结构时,我无法找到问题所在

我创建了基于 json 的结构,但它不适合我

["status": "1",
"error": false,
"data": [
    {
        "order_id": "11",
        "order_unique_id": "ORDR-1001",
        "store_name": "24X7",
        "otp_store": "781103",
        "product": [
            "Product One",
            "Product Two"
        ],
        "qty": [
            "1",
            "3"
        ],
        "user_details": {
            "name": "test",
            "number": "98145314586",
            "landmark": "test",
            "area": "Bow East",
            "pincode": "E3 9EG",
            "place": "Home"
        },
        "status": "2",
        "date": "2018-12-13",
        "time": "14:37:57"
    }]


struct RunnerStatus: Decodable {
var status: String
var error: Bool
var data: [Runner]
}

struct Runner: Decodable {
var order_id: String
var order_unique_id: String
var store_name: String
var otp_store: String
var product: [Product]
var qty: [Quantity]
var user_details: [UserDetails]
var status: String
var date: String
var time: String
}

struct Product: Decodable {
var ProductName: String
}

struct Quantity: Decodable {
var qty: String
}

struct UserDetails: Decodable {
var name: String
var number: String
var landmark: String
var area: String
var pincode: String
var place: String
}

所有结构都应该与相关的值/数据绑定

【问题讨论】:

  • "an error typeMismatch.":向我们展示完整的错误。这样我们就可以帮助您理解它(这样您就可以自己解决类似的问题)、更快地解决问题等等。
  • 将您的 json 转换为 struct codable 使用此链接:json4swift.com
  • @Larme 错误是错误序列化 json: typeMismatch(Swift.Dictionary, Swift.DecodingError.Context(codingPath: [CodingKeys(stringValue: "data", intValue: nil) ], debugDescription: "期望解码 Dictionary 但找到了一个数组。",底层错误: nil))
  • 这不可能是真正的错误。 data 的类型是正确的。您应该会收到有关 productqty 的错误。
  • @vadian 是的,但你能指出该地区吗,因为我不知道为什么会发生这种情况

标签: ios json swift4


【解决方案1】:

我认为你的结构应该如下:

// 1
struct RootClass : Codable {

    let data : [RunnerData]?
    let error : Bool?
    let status : String?
}

// 2
struct RunnerData : Codable {

    let date : String?
    let orderId : String?
    let orderUniqueId : String?
    let otpStore : String?
    let product : [String]?
    let qty : [String]?
    let status : String?
    let storeName : String?
    let time : String?
    let userDetails : UserDetail?

    enum CodingKeys: String, CodingKey {
        case date
        case orderId = "order_id"
        case orderUniqueId = "order_unique_id"
        case otpStore = "otp_store"
        case product
        case qty
        case status
        case storeName = "store_name"
        case time
        case userDetails = "user_details"
    }
}

// 3
struct UserDetail : Codable {

    let area : String?
    let landmark : String?
    let name : String?
    let number : String?
    let pincode : String?
    let place : String?
}

我希望这会对你有所帮助。如果您有任何疑问,请告诉我。

如果您比以前手动创建 JSON 结构,您应该具备适当的结构知识。否则会影响 JSONDecoding。有很多网站可以让你的 json 编码类在线,其中之一是:http://www.jsoncafe.com/

使用此网站创建您的 swift 可编码类。

【讨论】:

  • 尽可能生成编码密钥
  • @SagarChauhan 它工作正常,感谢您的回复。我想知道我的代码出了什么问题
  • let data : [Data]? 这行会导致意想不到的行为。 DataFoundation 类型。不要在自定义结构中使用它。
  • 你在这里做错了事。 struct Product: Decodable { var ProductName: String } & struct Quantity: Decodable { var qty: String } 不是必需的,因为这些键包含字符串数组。
  • @Desdenova,是的,你是对的。我已经改变了。感谢您的关注。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-05
相关资源
最近更新 更多