Swift5Json解析错误"dataCorrupted"
Swift 5 Json parsing error "dataCorrupted"
我尝试了所有解决方案,但其中 none 解决了我在解析时出现以下错误的问题。有人能找出这段代码的错误吗
序列化错误 json:dataCorrupted(Swift.DecodingError.Context(codingPath: [], debugDescription: "The given data was not valid JSON.", underlyingError: Optional(Error Domain=NSCocoaErrorDomain Code=3840 "Unable to convert data to string around character 2643." UserInfo={NSDebugDescription=无法将数据转换为字符 2643 周围的字符串。})))
struct Facts:Codable {
let title: String
let rows: [Rows]
}
struct Rows:Codable {
var title: String
var description: String
var imageHref: String
}
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let jsonUrlString = "https://dl.dropboxusercontent.com/s/2iodh4vg0eortkl/facts.json"
guard let url = URL(string: jsonUrlString) else{return}
URLSession.shared.dataTask(with: url) { (data, response, error) in
guard let data = data else { return }
do{
let facts = try JSONDecoder().decode(Facts.self, from: data)
print(facts)
}catch let jsonErr{
print("Error serializing json:", jsonErr)
}
}.resume()
}
}
//响应类型和编码问题。它应该是 application/json 和 //unicode 但实际上它是:
//响应内容类型:text/plain;字符集=ISO-8859-1
struct Facts:Codable {
let title: String
let rows: [Rows]!
}
struct Rows:Codable {
var title: String?
var description: String?
var imageHref: String?
}
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let jsonUrlString = "https://dl.dropboxusercontent.com/s/2iodh4vg0eortkl/facts.json"
guard let url = URL(string: jsonUrlString) else{return}
// var request = URLRequest(url: url)
// request.setValue("application/json; charset=utf-8", forHTTPHeaderField: "Content-Type") // the request is JSON
// request.setValue("application/json; charset=utf-8", forHTTPHeaderField: "Accept") // the expected response is also JSON
URLSession.shared.dataTask(with: url) { (data, response, error) in
guard let data = data else { return }
guard let string = String(data: data, encoding: String.Encoding.isoLatin1) else { return }
guard let properData = string.data(using: .utf8, allowLossyConversion: true) else { return }
do{
let facts = try JSONDecoder().decode(Facts.self, from: properData)
//dump(facts)
print(facts.title)
for row in facts.rows {
print(row.title ?? "no title")
print(row.description ?? "no description")
print(row.imageHref ?? "no img url")
print("---")
}
} catch let error {
print(error)
}
}.resume()
}
}
我通过执行一个额外的步骤解决了这个问题:
首先将数据转换为我们在闭包中获得的字符串,然后再次将此字符串转换回数据,这将 100% 有效。
let config = URLSessionConfiguration.default
let session = URLSession(configuration: config)
guard let request = requestObj.request else {
return
}
let task = session.dataTask(with: request) { (data, response, error) in
if let data = data {
let str = String(decoding: Data(data), as: UTF8.self)
**if let data = str.data(using: String.Encoding.utf8 ) {**
if error != nil {
if let err = error as NSError? {
failure(err)
}
}
if let httpResponse = response as? HTTPURLResponse {
let code = httpResponse.statusCode
switch code {
case HttpStatusCode.success:
success(data)
default:
failure(NSError(domain: "", code: code, userInfo: [NSLocalizedDescriptionKey: "Something went wrong"]))
}
}
}
}
}
// execute the HTTP request
task.resume()
我尝试了所有解决方案,但其中 none 解决了我在解析时出现以下错误的问题。有人能找出这段代码的错误吗
序列化错误 json:dataCorrupted(Swift.DecodingError.Context(codingPath: [], debugDescription: "The given data was not valid JSON.", underlyingError: Optional(Error Domain=NSCocoaErrorDomain Code=3840 "Unable to convert data to string around character 2643." UserInfo={NSDebugDescription=无法将数据转换为字符 2643 周围的字符串。})))
struct Facts:Codable {
let title: String
let rows: [Rows]
}
struct Rows:Codable {
var title: String
var description: String
var imageHref: String
}
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let jsonUrlString = "https://dl.dropboxusercontent.com/s/2iodh4vg0eortkl/facts.json"
guard let url = URL(string: jsonUrlString) else{return}
URLSession.shared.dataTask(with: url) { (data, response, error) in
guard let data = data else { return }
do{
let facts = try JSONDecoder().decode(Facts.self, from: data)
print(facts)
}catch let jsonErr{
print("Error serializing json:", jsonErr)
}
}.resume()
}
}
//响应类型和编码问题。它应该是 application/json 和 //unicode 但实际上它是: //响应内容类型:text/plain;字符集=ISO-8859-1
struct Facts:Codable {
let title: String
let rows: [Rows]!
}
struct Rows:Codable {
var title: String?
var description: String?
var imageHref: String?
}
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let jsonUrlString = "https://dl.dropboxusercontent.com/s/2iodh4vg0eortkl/facts.json"
guard let url = URL(string: jsonUrlString) else{return}
// var request = URLRequest(url: url)
// request.setValue("application/json; charset=utf-8", forHTTPHeaderField: "Content-Type") // the request is JSON
// request.setValue("application/json; charset=utf-8", forHTTPHeaderField: "Accept") // the expected response is also JSON
URLSession.shared.dataTask(with: url) { (data, response, error) in
guard let data = data else { return }
guard let string = String(data: data, encoding: String.Encoding.isoLatin1) else { return }
guard let properData = string.data(using: .utf8, allowLossyConversion: true) else { return }
do{
let facts = try JSONDecoder().decode(Facts.self, from: properData)
//dump(facts)
print(facts.title)
for row in facts.rows {
print(row.title ?? "no title")
print(row.description ?? "no description")
print(row.imageHref ?? "no img url")
print("---")
}
} catch let error {
print(error)
}
}.resume()
}
}
我通过执行一个额外的步骤解决了这个问题: 首先将数据转换为我们在闭包中获得的字符串,然后再次将此字符串转换回数据,这将 100% 有效。
let config = URLSessionConfiguration.default
let session = URLSession(configuration: config)
guard let request = requestObj.request else {
return
}
let task = session.dataTask(with: request) { (data, response, error) in
if let data = data {
let str = String(decoding: Data(data), as: UTF8.self)
**if let data = str.data(using: String.Encoding.utf8 ) {**
if error != nil {
if let err = error as NSError? {
failure(err)
}
}
if let httpResponse = response as? HTTPURLResponse {
let code = httpResponse.statusCode
switch code {
case HttpStatusCode.success:
success(data)
default:
failure(NSError(domain: "", code: code, userInfo: [NSLocalizedDescriptionKey: "Something went wrong"]))
}
}
}
}
}
// execute the HTTP request
task.resume()