如何将字符串转换为 json 字典。?
How to convert string to json dictionary.?
下面的一段代码,我正在使用将 string
转换为 dictionary
,但无法正常工作。
let body = "{status:0}"
do {
let dictionary = try convertToDictionary(from: body ?? "")
print(dictionary) // prints: ["City": "Paris"]
} catch {
print(error)
}
func convertToDictionary(from text: String) throws -> [String: String] {
guard let data = text.data(using: .utf8) else { return [:] }
let anyResult: Any = try JSONSerialization.jsonObject(with: data, options: [])
return anyResult as? [String: String] ?? [:]
}
两个问题:
- 值为
Int
,因此转换为 [String:String]
的类型失败。
- JSON 格式需要用双引号括起来的键。
这适用于 any
值类型
let body = """
{"status":0}
"""
do {
let dictionary = try convertToDictionary(from: body)
print(dictionary) // prints: ["City": "Paris"]
} catch {
print(error)
}
func convertToDictionary(from text: String) throws -> [String: Any] {
let data = Data(text.utf8)
return try JSONSerialization.jsonObject(with: data) as? [String:Any] ?? [:]
}
我会推荐你使用 Codable
协议。而不是使用字典使用一些特定的 class/structure 来解析数据。您可以使用类似这样的代码:
struct Status: Codable {
let status: Int
}
let body = "{\"status\":0}".data(using: .utf8)!
do {
let decoder = JSONDecoder()
let status = try decoder.decode(Status.self, from: body)
print(status) //Status(status: 0)
} catch {
print("\(error)")
}
这是一种更安全的处理 JSON 响应的方式。此外,它还为您提供了有关出现问题的信息,因此您可以轻松修复它。例如,如果您使用 let status: String
,您将收到此错误:
typeMismatch(Swift.String,
Swift.DecodingError.Context(codingPath: [CodingKeys(stringValue: "status", intValue: nil)],
debugDescription: "Expected to decode String but found a number instead.",
underlyingError: nil))
更多关于Codable
你可以阅读Encoding and Decoding Custom Types苹果写的文章,或者在线搜索Codable
教程——有很多关于它的好文章。
let body = "{\"status\":\"0\"}"
do {
let dictionary = try convertToDictionary(from: body )
print(dictionary)
} catch {
print(error)
}
func convertToDictionary(from text: String) throws -> [String: Any] {
if let data = text.data(using: .utf8) {
do {
return try (JSONSerialization.jsonObject(with: data, options: []) as? [String: Any] ?? [:])
} catch {
print(error.localizedDescription)
}
}
return [:]
}
输出 -> ["status": 0]
由于输入字符串不是 json 我建议使用非 json 解决方案
let array = body.dropFirst().dropLast().split(separator: ":").map {String([=10=])}
var dictionary = [String: String]()
if let key = array.first, let value = array.last {
dictionary[key] = value
}
下面的一段代码,我正在使用将 string
转换为 dictionary
,但无法正常工作。
let body = "{status:0}"
do {
let dictionary = try convertToDictionary(from: body ?? "")
print(dictionary) // prints: ["City": "Paris"]
} catch {
print(error)
}
func convertToDictionary(from text: String) throws -> [String: String] {
guard let data = text.data(using: .utf8) else { return [:] }
let anyResult: Any = try JSONSerialization.jsonObject(with: data, options: [])
return anyResult as? [String: String] ?? [:]
}
两个问题:
- 值为
Int
,因此转换为[String:String]
的类型失败。 - JSON 格式需要用双引号括起来的键。
这适用于 any
值类型
let body = """
{"status":0}
"""
do {
let dictionary = try convertToDictionary(from: body)
print(dictionary) // prints: ["City": "Paris"]
} catch {
print(error)
}
func convertToDictionary(from text: String) throws -> [String: Any] {
let data = Data(text.utf8)
return try JSONSerialization.jsonObject(with: data) as? [String:Any] ?? [:]
}
我会推荐你使用 Codable
协议。而不是使用字典使用一些特定的 class/structure 来解析数据。您可以使用类似这样的代码:
struct Status: Codable {
let status: Int
}
let body = "{\"status\":0}".data(using: .utf8)!
do {
let decoder = JSONDecoder()
let status = try decoder.decode(Status.self, from: body)
print(status) //Status(status: 0)
} catch {
print("\(error)")
}
这是一种更安全的处理 JSON 响应的方式。此外,它还为您提供了有关出现问题的信息,因此您可以轻松修复它。例如,如果您使用 let status: String
,您将收到此错误:
typeMismatch(Swift.String,
Swift.DecodingError.Context(codingPath: [CodingKeys(stringValue: "status", intValue: nil)],
debugDescription: "Expected to decode String but found a number instead.",
underlyingError: nil))
更多关于Codable
你可以阅读Encoding and Decoding Custom Types苹果写的文章,或者在线搜索Codable
教程——有很多关于它的好文章。
let body = "{\"status\":\"0\"}"
do {
let dictionary = try convertToDictionary(from: body )
print(dictionary)
} catch {
print(error)
}
func convertToDictionary(from text: String) throws -> [String: Any] {
if let data = text.data(using: .utf8) {
do {
return try (JSONSerialization.jsonObject(with: data, options: []) as? [String: Any] ?? [:])
} catch {
print(error.localizedDescription)
}
}
return [:]
}
输出 -> ["status": 0]
由于输入字符串不是 json 我建议使用非 json 解决方案
let array = body.dropFirst().dropLast().split(separator: ":").map {String([=10=])}
var dictionary = [String: String]()
if let key = array.first, let value = array.last {
dictionary[key] = value
}