如何从Decodable获取utf8解码字符串?

时间:2018-06-06 00:45:23

标签: swift utf-8 codable

问题是我有一个json数据包含和编码的字符串,例如:

let jsonData = "{ \"encoded\": \"SGVsbG8gV29ybGQh\" }".data(using: .utf8)

我需要的是获得" SGVsbG8gV29ybGQh"的解码值。字符串。

实际上,我可以通过实施以下方式获得所需的输出:

let decoder = JSONDecoder()
let result = try! decoder.decode(Result.self, from: jsonData!)

if let data = Data(base64Encoded: result.encoded), let decodedString = String(data: data, encoding: .utf8) {
    print(decodedString) // Hello World!
}

我必须做的是:

  • 将我从json(result.encoded)获得的编码字符串转换为Data对象

  • 再次将数据对象重新转换为字符串。

然而,实现它似乎不仅仅是一步,是否有更好的方法可以遵循这样的情况?

1 个答案:

答案 0 :(得分:0)

在处理Decodable的编码字符串时,实际上您甚至不必将该属性声明为String,只需直接将其声明为Data。 / p>

因此,对于您的情况,您应该将encoded编辑为:

struct Result: Decodable {
    var encoded: Data
}

因此:

let decoder = JSONDecoder()
let result = try! decoder.decode(Result.self, from: jsonData!)

let decodedString = String(data: result.encoded, encoding: String.Encoding.utf8)
print(decodedString ?? "") // decodedString

请记住,处理可解码的 Dates 非常类似,例如我们认为我们有以下json数据:

let jsonData = "{ \"timestamp\": 1527765459 }".data(using: .utf8)

显然,您没有收到timestamp作为号码并将其转换为Date对象,而是将其声明为Date

struct Result: Decodable {
    var timestamp: Date
}

因此:

let decoder = JSONDecoder()
// usually, you should edit decoding strategy for the date to get the expected result:
decoder.dateDecodingStrategy = .secondsSince1970

let result = try! decoder.decode(Result.self, from: jsonData!)
print(result.timestamp) // 2018-05-31 11:17:39 +0000