使用Codable解析JSON数据

时间:2018-07-31 21:03:52

标签: json swift alamofire codable

我有一个可编码模型帮助解析的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
}

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

尝试这样创建

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
        }