Swift-分析数据错误-Swift.DecodingError.dataCorrupted



我将SwiftSoup与Codable结合使用,以获得正确的元素并解析数据。然而,我收到这个错误:

JSON decode failed: Swift.DecodingError.dataCorrupted(Swift.DecodingError.Context(codingPath: [], debugDescription: "The given data was not valid JSON.", underlyingError: Optional(Error Domain=NSCocoaErrorDomain Code=3840 "No value." UserInfo={NSDebugDescription=No value.})))

我在网上查看了一下,确保我的数据正确匹配,甚至将预期的类型从Int更改为String,但出现了一个错误,说明需要Int。

这是我正在接收的数据,可以在控制台中打印:

data - 
{"test":0,"ppace":85,"pshooting":92,"ppassing":91,"pdribbling":95,"pdefending":38,"pphysical":65,"acceleration":91,"sprintspeed":80,"agility":91,"balance":95,"reactions":94,"ballcontrol":96,"dribbling":96,"positioning":93,"finishing":95,"shotpower":86,"longshotsaccuracy":94,"volleys":88,"penalties":75,"interceptions":40,"headingaccuracy":70,"marking":32,"standingtackle":35,"slidingtackle":24,"vision":95,"crossing":85,"freekickaccuracy":94,"shortpassing":91,"longpassing":91,"curve":93,"jumping":68,"stamina":72,"strength":69,"aggression":44,"composure":96}

这是我的功能:

func parseData() {
do {
let html = try String(contentsOf: url!, encoding: String.Encoding.ascii)
let doc: Document = try! SwiftSoup.parse(html)
let elements = try doc.getAllElements()
for element in elements {
switch element.id() {
case "player_stats_json":

let content = try! element.getElementsContainingText("ppace").text()
print(content.utf8)
let jsonData = content.data(using: .utf8)
do {
self.player = try JSONDecoder().decode(PlayerModel.self, from: Data(jsonData!))
} catch let jsonError as NSError {
print("JSON decode failed: (jsonError)")
print("data - (content)")
}
default:
break
}
}
} catch Exception.Error(type: let type, Message: let message) {
print(type)
print(message)
} catch {
print("")
}
}

这是我的模型文件:

struct PlayerModel: Codable {
var test: Int
var ppace: Int
var pshooting: Int
var ppassing: Int
var pdribbling: Int
var pdefending: Int
var pphysical: Int
var acceleration: Int
var sprintspeed: Int
var agility: Int
var balance: Int
var reactions: Int
var ballcontrol: Int
var dribbling: Int
var positioning: Int
var finishing: Int
var shotpower: Int
var longshotsaccuracy: Int
var volleys: Int
var penalties: Int
var interceptions: Int
var headingaccuracy: Int
var marking: Int
var standingtackle: Int
var slidingtackle: Int
var vision: Int
var crossing: Int
var freekickaccuracy: Int
var shortpassing: Int
var longpassing: Int
var curve: Int
var jumping: Int
var stamina: Int
var strength: Int
var aggression: Int
var composure: Int
}

我已经两次和三次检查了变量名与每个键的匹配情况。我已经将输出的数据粘贴到控制台的一个在线JSON验证器中,没有出现任何错误。我现在真是左右为难,因为我不明白自己哪里出了问题。

我仍然不知道您的解析出了什么问题。我已经解析了你的html,但我不知道为什么当尝试使用Int而不是Uint8时,它总是无法返回正确的值。这就是对我有效的:

import UIKit
import PlaygroundSupport
PlaygroundPage.current.needsIndefiniteExecution = true
struct PlayerModel: Codable {
let test: UInt8
let ppace: UInt8
let pshooting: UInt8
let ppassing: UInt8
let pdribbling: UInt8
let pdefending: UInt8
let pphysical: UInt8
let acceleration: UInt8
let sprintspeed: UInt8
let agility: UInt8
let balance: UInt8
let reactions: UInt8
let ballcontrol: UInt8
let dribbling: UInt8
let positioning: UInt8
let finishing: UInt8
let shotpower: UInt8
let longshotsaccuracy: UInt8
let volleys: UInt8
let penalties: UInt8
let interceptions: UInt8
let headingaccuracy: UInt8
let marking: UInt8
let standingtackle: UInt8
let slidingtackle: UInt8
let vision: UInt8
let crossing: UInt8
let freekickaccuracy: UInt8
let shortpassing: UInt8
let longpassing: UInt8
let curve: UInt8
let jumping: UInt8
let stamina: UInt8
let strength: UInt8
let aggression: UInt8
let composure: UInt8
}
let url = URL(string:"https://www.futbin.com/21/player/541/lionel-messi")!
URLSession.shared.dataTask(with: url) { data, response, error in
guard let data = data, let html = String(data: data, encoding: .utf8) else { return }
if let start = html.range(of: #"<div style="display: none;" id="player_stats_json">"#)?.upperBound,
let end = html[start...].range(of: #"</div>"#)?.lowerBound {
let json = html[start..<end]
do {
let player = try JSONDecoder().decode(PlayerModel.self, from: Data(json.utf8))
print(player)
} catch {
print(error)
}
}
}.resume()

这将打印

PlayerModel(测试:0,ppace:85,拍摄:92,播放:91,pdribling:95,pdefending:38,p物理:65,加速度:91,短跑速度:80,灵活性:91,平衡力:95,反应力:94,控球:96,盘带:96,定位:93,终结:95,投篮:86,长传:94,凌空抽射:88,点球:75,拦截:40,头部准确度:70,标记:32,站立滑车:35,滑动滑车:24,视野:95,传中:85,任意球准确度:94,短传:91,长传:91,曲线:93,跳跃:68,耐力:72,力量:69,侵略性:44,沉着:96(

最新更新