【问题标题】:How to convert JSON response to Dictionary format in Swift如何在 Swift 中将 JSON 响应转换为字典格式
【发布时间】:2019-04-26 02:03:00
【问题描述】:

如何将此 JSON 响应与消息中的数百个键转换,以便能够将其分配给变量类型 [AnyHashable: Any]

JSON

{
    "content": {
       "message": {
            "greet": "Hello world",
            "error": "There is an error",
            "thanks": "Thank you",
            ...
        }
    }
}

尝试

解析 JSON 后,我未能将 jsonData 分配给接受 [AnyHashable: Any] 的变量。我尝试将message 类型更改为[AnyHashable: Any],但它不符合Decodable

// Model.swift

struct TestCase: Decodable {
    let content: Content
}

struct Content: Decodable {
    let message: [String: String]
}


// ViewController.swift

private var testVariable: [AnyHashable: Any]

private func loadJson(filename: String) {
    if let url = Bundle.main.url(forResource: filename, withExtension: "json") {
        do {
            let data = try Data(contentsOf: url)
            let decoder = JSONDecoder()
            let jsonData = try decoder.decode(TestCase.self, from: data)

            // Problem faced
            testVariable = jsonData // error

        } catch let jsonError {
            print("JsonError: ", jsonError)
        }
    }
}

【问题讨论】:

  • 显示您的实际代码。显示您尝试过的内容。显示您遇到的问题。
  • @samuelkith 您可以使用 JSONSerialization jsonObject(with: Data) 将您的 json 数据字符串转换为字典。 let dictionary = try JSONSerialization.jsonObject(with: Data(json.utf8)) as? [String: [String: [String: String]]]
  • @Sh_Khan,它是我正在使用的具有该类型的库中的一个变量。 @LeoDabus,如果我想使用Decodable 会是什么样子
  • @Sh_Khan json 数据是一个 utf8 字符串。您不能将字符串转换为字典
  • testVariable = (try JSONSerialization.jsonObject(with: data)) as? [AnyHashable: Any] ?? [:]

标签: json swift dictionary


【解决方案1】:

你不能两者兼得。

如果您想用Decodable 解析JSON,那么您必须将testVariable 声明为

private var testVariable : TestCase?

或者您想将testVariable 保留为[AnyHashable: Any],然后删除结构并使用传统的JSONSerialization 解码JSON

罢工>

//print(s)
struct TestCase: Decodable {
    let content: Content
}

struct Content: Decodable {
    let message: [String: String]
}

// ViewController.swift

private var testVariable = [AnyHashable:Any]()

private func loadJson(filename: String) {
    if let url = Bundle.main.url(forResource: filename, withExtension: "json") {
        do {
            let data = try Data(contentsOf: url)
            testVariable = try JSONSerialization.jsonObject(with: data) as? [AnyHashable: Any] ?? [:]

        } catch {
            print("JsonError: ", error)
        }
    }
}

【讨论】:

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