【问题标题】:How to map nested JSON response?如何映射嵌套的 JSON 响应?
【发布时间】:2021-04-29 15:44:50
【问题描述】:

我从服务器收到一些按嵌套字典顺序排列的 JSON 响应。我得到的响应是这样的:

data =     {
"cart_count" = "5.8";
"del_fee_popup" = 1;
"delievery_fee" = 26;
"delievery_fee_message" = "Free delivery on order more than 500 tk.";

"delievery_fee_types" =         (
                {
        "delievery_fee" = 26;
        "delievery_fee_type" = 1;
        "from_time" = 7;
        "from_time_str" = "7 AM";
        message = "Estimated delivery time 1.5~4hrs after accepted the order";
        title = "Regular Delivery";
        "to_time" = 22;
        "to_time_str" = "10 PM";
    },
                {
        "delievery_fee" = 80;
        "delievery_fee_type" = 2;
        "from_time" = 10;
        "from_time_str" = "10 AM";
        message = "Estimated delivery time 1~1.5hr after accept the order";
        title = "Urgent Delivery";
        "to_time" = 0;
        "to_time_str" = "12 AM";
    }
);
discount = 0;
total = "31.8";

我可以像这样从响应中映射“数据”:

 mutating func deserilize(values: Dictionary<String, Any>?) {
    Data = (data as! [String : Any])
    deliveryFee = Data!["delievery_fee"] as! Double
    total = Data!["total"] as! Double
    discount = Data!["discount"] as! Double
    cartCount = Data!["cart_count"] as! Double
    del_fee_popup = Data!["del_fee_popup"] as! Bool
}

我需要一些建议来映射 JSON 响应中的“delievery_fee_types”。

【问题讨论】:

  • 你为什么不使用Codable(如果你有Swift4+)?它更容易。但是delievery_fee_types 是[[String: Any]],一个字典数组,因为这是您最初的问题。
  • 首先,我建议你使用lowerCamelCasing作为变量名。其次,我也建议您阅读Codable 以简化您的工作流程。如果您坚持按照自己的方式行事,那么您的 delievery_fee_types 将是 [[String : Any]] 类型。

标签: ios swift


【解决方案1】:

创建一个新的 swift 文件:

import UIKit

struct JData: Decodable {
    let cart_count: Float?
    let del_fee_popup: Int?
    let delievery_fee: Int?
    let delievery_fee_message: String?
    let discount: Int?
    let total: Float?
    let delivery_fee_types: [Delivery_fee_types?]
    
}

struct Delivery_fee_types: Decodable {
    let delievery_fee: Int?
    let delievery_fee_type: Int?
    let from_time: Int?
    let from_time_str: String?
    let message: String?
    let title: String?
    let to_time: Int?
    let to_time_str: String?
}

如果您在本地加载 Json,请创建一个空文件,将其命名为 data.json, 将下面的json粘贴到文件中:

{"cart_count" : "5.8", “del_fee_popup”:1, “delievery_fee”:26, "delievery_fee_message" : "订单超过 500 吨免费送货。","delievery_fee_types" :[ { “delievery_fee”:26, “delievery_fee_type”:1, “从时间”:7, “from_time_str”:“早上 7 点”, "message" : "收到订单后预计交货时间 1.5~4 小时", "title" : "定期发货", “到时间”:22, “to_time_str”:“晚上 10 点” }, { “delievery_fee”:80, “delievery_fee_type”:2, “从时间”:10, “from_time_str”:“上午 10 点”, "message" : "接受订单后预计交货时间 1~1.5hr", "title" : "紧急交付", “到时间”:0, “to_time_str”:“上午 12 点” } ], “折扣”:0, “总计”:“31.8”}

创建一个新的 swift 文件并添加:

import UIKit

class JsonClass: NSObject {

    class func readLocalFile(forName name: String) -> Data? {
        do {
            if let bundlePath = Bundle.main.path(forResource: name,
                                             ofType: "json"),
                let jsonData = try String(contentsOfFile: bundlePath).data(using: .utf8) {
                return jsonData
            }
        } catch {
            print(error)
        }
        return nil
    }

    class func parse(jsonData: Data) -> JData? {
        do {
            let decodedData = try JSONDecoder().decode(JData.self, from: jsonData)
            return decodedData
        } catch {
            print("decode error: ",error)
        }
        return nil
    }
}

您希望在哪里使用您的数据:

 if let localData = JsonClass.readLocalFile(forName: "data") {
        if let decodedJson = JsonClass.parse(jsonData: localData) {
            print(decodedJson as Any)
            // example print(decodedJson.cart_count as any)
        }
  }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-04
    • 1970-01-01
    • 1970-01-01
    • 2020-07-02
    • 2018-03-09
    • 2021-06-20
    • 1970-01-01
    • 2021-03-08
    相关资源
    最近更新 更多