【问题标题】:Parsing the JSON data with Codable使用 Codable 解析 JSON 数据
【发布时间】:2018-07-31 21:03:52
【问题描述】:

我在可编码模型的帮助下解析了一个 JSON 响应。尽管我的模型看起来不错,但我收到以下错误,

失败:typeMismatch(Swift.Dictionary, Swift.DecodingError.Context(codingPath: [CodingKeys(stringValue: “data”, intValue: nil)

JSON 响应是:

{
    "status": "success",
    "message": "successfully.",
    "user": {
        "username": "admin",
        "profileImage": "/storage/default.png"
    },
    "data": {
        "cash": {
            "withdrawableCash": "$99999910",
            "outstandingOrders": "$0"
        },
        "offering": [
            {
                "company": "TSLA",
                "location": "Location",
                "amount": 40
            },
            {
                "company": "TSLA",
                "location": "Location",
                "amount": 50
            }
        ],
        "history": [
            {
                "amount": 100000000,
                "order_id": 0,
                "order_type": "deposit",
                "status": 1,
                "message": "Added money into wallet",
                "transaction_time": "30-07-2018 18:10"
            },
            {
                "amount": 40,
                "order_id": 1,
                "order_type": "auctionBid",
                "status": 2,
                "message": "Placed bid with 4 notes, on Auction (TSLA)",
                "transaction_time": "30-07-2018 18:11"
            },
            {
                "amount": 50,
                "order_id": 2,
                "order_type": "auctionBid",
                "status": 2,
                "message": "Placed bid with 5 notes, on Auction (TSLA)",
                "transaction_time": "30-07-2018 18:11"
            }
        ]
    }
}

模型是:

public struct WalletResponseModel: Codable {
    public let status: String
    public let message: String
    public let user: UserData
    public let data: WalletData
}

public struct UserData: Codable {
    public let username: String
    public let profileImage: URL

    enum CodingKeys: String, CodingKey {
        case username
        case profileImage = "profileImage"
    }
}

public struct WalletData: Codable {
    public let cash: Cash
    public let history: [HistoryItem]
    public let offerings: [Offering]

    enum CodingKeys: String, CodingKey {
        case cash
        case history
        case offerings = "offering"
    }
}

public struct Cash: Codable {
    public let withdrawableCash: String
    public let outstandingOrders: String
}

public struct HistoryItem: Codable {
    public let amount: Int
    public let status: Int
    public let orderId: Int
    public let orderType: String
    public let message: String
    public let transactionTime: String

    enum CodingKeys: String, CodingKey {
        case amount, status, message
        case transactionTime = "transaction_time"
        case orderId = "order_id"
        case orderType = "order_type"
    }
}

public struct Offering: Codable {
    public let company: String
    public let amount: Int
    public let location: String
}

【问题讨论】:

  • 显示您尝试解码 JSON 的代码。
  • Edit 你的问题。不要在 cmets 中发布代码。
  • 请让我知道我应该发布什么。我需要尽快解决这个问题。
  • 我已经告诉过你要发什么了。您已经尝试发布它。只需将代码放在问题中,而不是 cmets。

标签: json swift alamofire codable


【解决方案1】:

我没有看到错误。但是以前当我遇到类似的问题时,我从一只小手开始,里面装满了数据和模型中的元素并进行了测试。一次添加一两个,直到发生错误并且可以找到问题。

【讨论】:

    【解决方案2】:

    试着像这样创作

    struct Result:Decodable {
        let status: String
        let message: String
        let user:user
        let data: data
    
    }
    struct user:Decodable {
        let username: String
        let profileImage:String
    }
    struct data:Decodable {
        let cash:cash
        let offering:[offering]
        let history:[history]
    }
    struct cash:Decodable {
        let outstandingOrders:String
        let withdrawableCash: String
    }
    struct offering:Decodable {
        let location:String
        let company:String
        let amount:Int
    }
    struct history:Decodable {
        let amount: Int
        let message: String
        let orderId: Int
        let orderType: String
        let status:Int
        let transactionTime: String
    }
    

    并像

    这样解码数据
    do {
                 let decoder = JSONDecoder()
                decoder.keyDecodingStrategy = .convertFromSnakeCase
                let response = try decoder.decode(Result.self, from: data)
                print(response)
    
            } catch {
                // handle error
            }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多