【问题标题】:iOS Swift Casting JSON response with strange format to dictionaryiOS Swift将具有奇怪格式的JSON响应转换为字典
【发布时间】:2017-10-18 17:20:33
【问题描述】:

我正在尝试将 JSON 响应快速转换为可用的字典。这似乎是一个简单的任务,但是我得到的 JSON 响应的格式很奇怪,无论我尝试什么,我都无法将其转换为字典。我能找到的所有谷歌示例都假设 JSON 响应的格式如下:

    {
    "someKey": 42.0,
    "anotherKey": {
        "someNestedKey": true
    },
    {
    "someKey": 42.0,
    "anotherKey": {
        "someNestedKey": true
    }

但是,我使用以下代码收到的 swift 打印响应格式如下:

{assets = (
    {
    "someKey": 42.0,
    "anotherKey": {
        "someNestedKey": true
    },
    {
    "someKey": 42.0,
    "anotherKey": {
        "someNestedKey": true
    }
);
}

这是我在尝试将这些数据快速转换为字典时所能得到的。它将“assets”添加为字典中的单个键,该键的值是整个响应的其余部分。

    let url = URL(string: "https://\(apiKey):\(password)@\(yourStore).myshopify.com/admin/themes/\(currentThemeID)/assets.json")!

let task = URLSession.shared.dataTask(with: url) { (data, response, error) in
    if error != nil {
        print(error)
    } else {
        if let urlContent = data {
            do {

                let jsonResult = try JSONSerialization.jsonObject(with: urlContent, options: [.allowFragments, JSONSerialization.ReadingOptions.mutableContainers])
                print(jsonResult)
                if let dictionary = jsonResult as? [String: [String]] {
                    print(dictionary)
                }

            } catch {
                print("json processing failed")
            }
        }
    }
}
task.resume()

我很确定挂断存在于 JSON 响应中两个“括号”和“分号”的存在周围。我找不到任何关于这些字符如何影响响​​应的文档,或者在尝试快速向下转换时如何处理它们的文档。

任何帮助将不胜感激!

编辑: 我在浏览器中提取了 JSON 响应,格式如下:

{"assets":[{"key":"assets\/1-1.png","public_url":"https:\/\/cdn.shopify.com\/s\/files\/1\/0810\/2125\/t\/22\/assets\/1-1.png?5272098227851596200","created_at":"2016-05-16T16:58:27-05:00","updated_at":"2016-05-16T16:58:27-05:00","content_type":"image\/png","size":9127,"theme_id":124078279}{"key":"templates\/search.liquid","public_url":null,"created_at":"2016-05-16T16:59:04-05:00","updated_at":"2016-05-16T16:59:04-05:00","content_type":"text\/x-liquid","size":2931,"theme_id":124078279}]}

此 JSON 响应没有资产 = ();部分,并且格式正确。不知何故,我的 swift 代码不正确地解析数据?

【问题讨论】:

  • 该响应是print(jsonResult) 的结果还是您得到的实际响应数据?它不是有效的 json
  • @dan 我在浏览器中提取了响应,并且其中的格式正确。我在上面的问题编辑中发布了代码片段。这告诉我问题出在我的 Swift 代码中,以及它是如何解析数据的?
  • 回答你的问题@dan,这是快速打印的结果,而不是实际的 json 响应。
  • 您应该将其转换为[String: [[String: Any]]]
  • 就是这样@dan。谢谢你的时间。如果您添加为答案,我会接受。

标签: ios json swift


【解决方案1】:

反复转换为 [String: Any] 以获取所需的 JSON 响应部分。

    do {
        let jsonResult = try JSONSerialization.jsonObject(with: urlContent, options: [.allowFragments, JSONSerialization.ReadingOptions.mutableContainers])
        print(jsonResult)
        guard
            let dictionary = jsonResult as? [String: Any],
            let assetData = dictionary["assets"] as? [String: Any] else {
                print("The JSON structure doesn't meet our expectations \(urlContent)")
                return
        }
        print(assetData)
    } catch {
        print("json processing failed")
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-28
    • 1970-01-01
    • 2020-12-02
    • 2023-03-10
    • 1970-01-01
    相关资源
    最近更新 更多