【问题标题】:read JSON result as array of dictionary将 JSON 结果读取为字典数组
【发布时间】:2019-03-28 19:47:22
【问题描述】:

如何解析以下 JSON 结果

{
        "AddedByName": "jhon",
        "ApproveAction": 0,
        "ApproveActionName": "",
        "photos": null,
        "Status": 0,

    },
    {
        "AddedByName": "mike",
        "ApproveAction": 0,
        "ApproveActionName": "",
        "photos": null,
        "Status": 0,
    },
    {
        "AddedByName": "someone",
        "ApproveAction": 0,
        "ApproveActionName": "",
        "photos": [
            {
                "Id": 53,
                "Serial": 1,
                "Url": "0afe88a3-76e1-4bac-a392-173040936300.jpg"
            }
        ],
        "Status": 0,
    }

我怎样才能到达“照片”数组?

我已经声明了本地字典数组来保存整个响应,如下所示

    var myLocalArray = [[String:Any]]()

并像这样从 JSON 响应中填充它

                if let Json = response.result.value as? [String:Any] {

                if let ActionData = Json["ActionData"] as? [[String:Any]] {

                    self. myLocalArray = ActionData

                }
            }

它的工作原理

但我无法访问“照片”数组,请帮助

【问题讨论】:

    标签: json swift xcode swift4 alamofire


    【解决方案1】:

    我将为您提供智能解决方案,而不是在您尝试将 Json 转换为有用的数据模型并使其更易于操作时有用。 使用可解码的力量。 该模型将帮助您捕获 Json

    struct User: Decodable {
        var AddedByName: String
        var ApproveAction: Int
        var ApproveActionName: String
        var photos: [Photo]?
        var Status: Int
    
        struct Photo: Decodable {
            var Id: Int
            var Serial: Int
            var Url: String
        }
    }
    

    现在只需一行代码即可让您的 Json 结构化数据:

    let responseData = try JSONDecoder().decode([User].self, from: jsonD)
    

    【讨论】:

    • 这是个好主意,但意味着要从头开始工作:(
    • 如果可以的话我需要临时解决方案
    • 这种方式将帮助你缩短时间,这是 DRY 的一部分(不要重复你自己)
    • 但这需要时间:(
    • 我可以理解,但请看一下这两个链接,它将如何使请求变得如此容易。这是请求结构pastebin.com/suzLrzNq。这个链接告诉你如何提出请求pastebin.com/huBH1HDR
    【解决方案2】:

    @swiftIos 使用 Decodable 提供了答案,这绝对是处理这种情况的更好方法。

    但您可以使用当前的photosself.myLocalArray 访问:

    if let jsonData = response.result.value as? [String: Any] {
        if let actionData = jsonData["ActionData"] as? [[String:Any]] {
            self.myLocalArray = actionData
        }
    }
    

    现在您有了actionData 的数组,因此通过将特定索引的actionData 提取为self.myLocalArray[0] 来访问照片。整体:

    let index = 0
    if self.myLocalArray.count > index {
        if let photoArrayIndex0 = self.myLocalArray[index]["photos"] as? [[String: Any]] {
            print(photoArrayIndex0)
        }
    }
    

    【讨论】:

    • 如果让 imgeArray = myLocalArray[indexPath.row]["Photos"] as? [[String:Any]] { 让 imgUrl = imgeArray[indexPath.row]["Url"] as! String } 但给了我以下错误 Thread 1: Fatal error: Index out of range
    • 您尝试访问的索引多于数组中显示的元素。也更新了我对此检查的答案。
    猜你喜欢
    • 2018-11-26
    • 1970-01-01
    • 1970-01-01
    • 2011-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多