问题是我有一个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对象
再次将数据对象重新转换为字符串。
然而,实现它似乎不仅仅是一步,是否有更好的方法可以遵循这样的情况?
答案 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