如何使用 JSON 解码器解码自定义 JSON 值
How to decode custom JSON values using JSONDecoder
后端 returns 自定义 JSON 位置值。如示例所示:
{
"location": (54.000000, 21.000000)
}
为了解析JSON我正在使用这个代码:
let json = """
{
"location": (54.000000, 21.000000)
}
"""
struct Location: Codable {
var latitude: Double
var longitude: Double
}
let dataJson = json.data(using: .utf8)!
let location = try? JSONDecoder().decode(Location.self, from: dataJson)
当我尝试使用 JSON解码器创建 Location 对象时,出现错误:给定的数据无效 JSON.
dataCorrupted(Swift.DecodingError.Context(codingPath: [], debugDescription: "The given data was not valid JSON.", underlyingError: Optional(Error Domain=NSCocoaErrorDomain Code=3840 "Invalid value around character 18." UserInfo={NSDebugDescription=Invalid value around character 18.})))
我知道它无效 JSON。
我可以重写哪些方法可以解析无效的 JSON 值?
如果第三方以一致的方式生成无效的 JSON,您可以使用正则表达式将其修复回有效的 JSON。 这不是万无一失的。如果 JSON 的格式不同,它可能会失败。最好的做法是让第三方更正他们的后端。
您可以使用正则表达式将圆括号替换为方括号:
var json = """
{
"location": (54.000000, 21.000000)
}
"""
let regex = try! NSRegularExpression(pattern: "\\"location\\":\s*\((.+?)\)", options: [])
let fullRange = NSRange(..<json.endIndex, in: json)
json = regex.stringByReplacingMatches(in: json, options: [], range: fullRange, withTemplate: "\"location\": []")
您还需要向 Location
结构添加自定义解码器,因为它现在被编码为数组:
struct Location: Decodable {
var latitude: Double
var longitude: Double
init(from decoder: Decoder) throws {
var container = try decoder.unkeyedContainer()
latitude = try container.decode(Double.self)
longitude = try container.decode(Double.self)
}
}
解码示例:
struct Response: Decodable {
var location: Location
}
let dataJson = json.data(using: .utf8)!
let location = try JSONDecoder().decode(Response.self, from: dataJson)
后端 returns 自定义 JSON 位置值。如示例所示:
{
"location": (54.000000, 21.000000)
}
为了解析JSON我正在使用这个代码:
let json = """
{
"location": (54.000000, 21.000000)
}
"""
struct Location: Codable {
var latitude: Double
var longitude: Double
}
let dataJson = json.data(using: .utf8)!
let location = try? JSONDecoder().decode(Location.self, from: dataJson)
当我尝试使用 JSON解码器创建 Location 对象时,出现错误:给定的数据无效 JSON.
dataCorrupted(Swift.DecodingError.Context(codingPath: [], debugDescription: "The given data was not valid JSON.", underlyingError: Optional(Error Domain=NSCocoaErrorDomain Code=3840 "Invalid value around character 18." UserInfo={NSDebugDescription=Invalid value around character 18.})))
我知道它无效 JSON。 我可以重写哪些方法可以解析无效的 JSON 值?
如果第三方以一致的方式生成无效的 JSON,您可以使用正则表达式将其修复回有效的 JSON。 这不是万无一失的。如果 JSON 的格式不同,它可能会失败。最好的做法是让第三方更正他们的后端。
您可以使用正则表达式将圆括号替换为方括号:
var json = """
{
"location": (54.000000, 21.000000)
}
"""
let regex = try! NSRegularExpression(pattern: "\\"location\\":\s*\((.+?)\)", options: [])
let fullRange = NSRange(..<json.endIndex, in: json)
json = regex.stringByReplacingMatches(in: json, options: [], range: fullRange, withTemplate: "\"location\": []")
您还需要向 Location
结构添加自定义解码器,因为它现在被编码为数组:
struct Location: Decodable {
var latitude: Double
var longitude: Double
init(from decoder: Decoder) throws {
var container = try decoder.unkeyedContainer()
latitude = try container.decode(Double.self)
longitude = try container.decode(Double.self)
}
}
解码示例:
struct Response: Decodable {
var location: Location
}
let dataJson = json.data(using: .utf8)!
let location = try JSONDecoder().decode(Response.self, from: dataJson)