繁体   English   中英

在Swift中将来自JSON字典的http请求的数据转换为一个字典数组

[英]Converting Data from http request from JSON Dictionary of Dictionaries into one Array of Dictionaries in Swift

当运行我的http请求时,我以以下方式返回了数据。

我要求如下

    do {
        if let file = URL(string: "https://myhttprequest....") {
            let data = try Data(contentsOf: file)
            let json = try JSONSerialization.jsonObject(with: data, options: [])
            if let object = json as? [String: Any] {
                // json is a dictionary
                print(object)
            } else {
                print("JSON is invalid")
            }
        } else {
            print("no file")
        }
    } catch {
        print(error.localizedDescription)
    }

例如,http请求显示如下

{"created":[{"id":"-LVEAdIk2KwDmxBj25pK","caption":"Cool watch bro ","creationDate":1546442937.5934439,"imageHeight":1000,"imageUrl":"https://firebasestorage.googleapis.com/..."}],"reshared":[{"id":"-LVEAdIk2KwDmxBj25pK","caption":"Cool watch bro ","creationDate":1546442937.5934439,"imageHeight":1000,"imageUrl":"https://firebasestorage.googleapis.com/..."}]}

我希望能够将object [“ created”]和object [“ reshared”]的值放在一起,以包含两个字典[[caption:“”,creationDate:“” ...],[caption:]的数组““, 创建日期:””...]]

我已经尝试过像object [“ created”]那样单独访问它们,但是它不是字典类型,我似乎无法弄清楚如何使其成为一体。

更新:因此,我现在正在执行以下防护:let uid = Auth.auth()。currentUser?.uid else {return}

    let url = URL(string: "https://us-central1-flashtrend-bdcd3.cloudfunctions.net/getFeed/\(uid)")!

    let task = URLSession.shared.dataTask(with: url) {(data, response, error) in
        guard let firstData = data else { return }
        let jsonStr = String(data: firstData, encoding: .utf8)!
        guard  let data = jsonStr.data(using: .utf8) else {
            return
        }
        do {
            guard let json = try JSONSerialization.jsonObject(with: data, options: []) as? [String: Any] else {
                return
            }
            guard let created = json["created"], let reshared = json["reshared"] else {
                return
            }
            let result = [created, reshared]

            print(result)

        } catch  {
            print(error.localizedDescription)
        }
    }

    task.resume()

但是当我打印时看起来很奇怪

[<__NSSingleObjectArrayI 0x600002de2290>(
{
    caption = "Cool watch bro ";
    creationDate = "1546442937.593444";
    id = "-LVEAdIk2KwDmxBj25pK";
    imageHeight = 1000;
    imageUrl = "https://firebasestorage.googleapis.com/v0/b/flashtrend-bdcd3.appspot.com/o/posts%2FE346E4B7-31D8-4E9E-89F2-DA7C426C0537?alt=media&token=4936ce58-64bb-4d5a-b913-c3b87705614f";
    imageWidth = 750;
    swipes = 0;
    userid = U9097gARoXOus96vT1uBHAcNPs03;
    views = 1;
}
)
, <__NSArray0 0x600002df40c0>(

)
] 

我已经将http请求结果更改为json string ,示例代码如下,可以在我的xcode上正常工作:

let jsonStr = "{\"created\":{\"caption\":\"Cool watch bro \",\"creationDate\":\"1546442937.593444\",\"id\":\"-LVEAdIk2KwDmxBj25pK\",\"imageHeight\":1000,\"imageUrl\":\"https://firebasestorage.googleapis.com/v0/b/flashtrend-bdcd3.appspot.com/o/posts/E346E4B7-31D8-4E9E-89F2-DA7C426C0537?alt:media&token:4936ce58-64bb-4d5a-b913-c3b87705614f\",\"imageWidth\":750,\"swipes\":0,\"userid\":\"U9097gARoXOus96vT1uBHAcNPs03\",\"views\":1},\"reshared\":{\"caption \":\"Cool watch bro\",\"creationDate \":\"1546442937.593444\",\"id \":\"-LVEAdIk2KwDmxBj25pK \",\"imageHeight\":1000,\"imageUrl\":\"https://firebasestorage.googleapis.com/v0/b/flashtrend-bdcd3.appspot.com/o/posts/E346E4B7-31D8-4E9E-89F2-DA7C426C0537?alt:media&token:4936ce58-64bb-4d5a-b913-c3b87705614f\",\"imageWidth\":750,\"swipes\":0,\"userid\":\"U9097gARoXOus96vT1uBHAcNPs03\",\"views\":1}}"

guard  let data = jsonStr.data(using: .utf8) else {
    return
}
do {
    guard let json = try JSONSerialization.jsonObject(with: data, options: []) as? [String: Any] else {
        return
    }
    guard let created = json["created"], let reshared = json["reshared"] else {
        return
    }
    let result = [created, reshared]
    print(result)
} catch  {
    print(error.localizedDescription)
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM