读取JSON结果作为字典数组

时间:2018-10-24 11:48:44

标签: json swift xcode swift4 alamofire

如何解析以下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

                }
            }

它有效

但是我无法到达“照片”数组,请帮忙

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分:0)

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

但是根据您当前的情况,您可以从photos访问self.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)
    }
}