Преобразование данных из http-запроса из Словаря JSON в один массив словарей в Swift - PullRequest
0 голосов
/ 03 января 2019

При выполнении 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/..."}]}

Я хочу иметь возможность выставить значение объекта ["создал "] и объект [" reshared "] вместе, чтобы иметь один массив из двух словарей [[caption:" ", creationDate:" "...], [caption:" ", creationDate:" "...]]]

Я пытался получить доступ к ним по отдельности, как объект ["создан"], но он не относится к словарю типов, и я не могу понять, как его получить.

ОБНОВЛЕНИЕ: Итак, ясейчас я выполняю следующую защиту: 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>(

)
] 

1 Ответ

0 голосов
/ 03 января 2019

Я изменил результат запроса 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)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...