在swift 4中解析JSON时出错
我试图在swift 4中解析JSON,但出现以下错误: 执行被中断,原因:EXC\u BAD\u指令 (代码=EXC_I386_INVOP,子代码=0x0)。这一过程被留在了最后阶段 在中断的地方,使用“threadreturn-x”返回到 表达式计算之前的状态 这是我的代码:在swift 4中解析JSON时出错,json,swift,swift4,codable,Json,Swift,Swift4,Codable,我试图在swift 4中解析JSON,但出现以下错误: 执行被中断,原因:EXC\u BAD\u指令 (代码=EXC_I386_INVOP,子代码=0x0)。这一过程被留在了最后阶段 在中断的地方,使用“threadreturn-x”返回到 表达式计算之前的状态 这是我的代码: struct Beer : Codable { let name: String let brewery: String let style: String } let jsonResponse
struct Beer : Codable {
let name: String
let brewery: String
let style: String
}
let jsonResponse = [
"name": "Endeavor",
"brewery": "Saint Arnold",
"style": "ipa"
]
let jsonString = String(describing: jsonResponse)
let jsonData = jsonString.data(using: .utf8)
let decoder = JSONDecoder()
let beer = try! decoder.decode(Beer.self, from: jsonData!)
print(beer)
您没有正确创建JSON数据<代码>字符串(描述:)不创建JSON字符串。它创建一个对象的调试描述,它与JSON无关 与其使用字典,不如从
Beer
对象创建数据
,然后再次反序列化:
struct Beer : Codable {
let name: String
let brewery: String
let style: String
}
//Create a Beer
let aBeer = Beer(name: "Endeavor", brewery: "Saint Arnold", style: "ipa") //Create a Beer object
//--------------------------------------
//Serialize (dehydrate) the Beer
let encoder = JSONEncoder()
encoder.outputFormatting = .prettyPrinted
let jsonData: Data
do {
jsonData = try encoder.encode(aBeer)
} catch {
fatalError("Splat!. \(error.localizedDescription)")
}
//---------------------------------------
//print the dehydrated Beer
if let jsonText = String(data: jsonData, encoding: .utf8) {
print("JSON text = \(jsonText)")
}
//---------------------------------------
//Deserialize (rehydrate) the Beer
let decoder = JSONDecoder()
let decodedBeer = try! decoder.decode(Beer.self, from: jsonData)
print("Rehydrated beer = \(decodedBeer)")
您没有正确创建JSON数据<代码>字符串(描述:)不创建JSON字符串。它创建一个对象的调试描述,它与JSON无关 与其使用字典,不如从
Beer
对象创建数据
,然后再次反序列化:
struct Beer : Codable {
let name: String
let brewery: String
let style: String
}
//Create a Beer
let aBeer = Beer(name: "Endeavor", brewery: "Saint Arnold", style: "ipa") //Create a Beer object
//--------------------------------------
//Serialize (dehydrate) the Beer
let encoder = JSONEncoder()
encoder.outputFormatting = .prettyPrinted
let jsonData: Data
do {
jsonData = try encoder.encode(aBeer)
} catch {
fatalError("Splat!. \(error.localizedDescription)")
}
//---------------------------------------
//print the dehydrated Beer
if let jsonText = String(data: jsonData, encoding: .utf8) {
print("JSON text = \(jsonText)")
}
//---------------------------------------
//Deserialize (rehydrate) the Beer
let decoder = JSONDecoder()
let decodedBeer = try! decoder.decode(Beer.self, from: jsonData)
print("Rehydrated beer = \(decodedBeer)")
首先通过对响应进行编码来创建JSON数据,然后对其进行解码
struct Beer : Codable {
let name: String
let brewery: String
let style: String
}
let jsonResponse = [
"name": "Endeavor",
"brewery": "Saint Arnold",
"style": "ipa"
]
let data = try? JSONSerialization.data(withJSONObject: jsonResponse,
options: .prettyPrinted)
let jsonEncoder = JSONEncoder()
let encoded = try jsonEncoder.encode(jsonResponse)
let jsonDecoder = JSONDecoder()
let beer = try jsonDecoder.decode(Beer.self, from: data!)
print(beer)
首先通过对响应进行编码来创建JSON数据,然后对其进行解码
struct Beer : Codable {
let name: String
let brewery: String
let style: String
}
let jsonResponse = [
"name": "Endeavor",
"brewery": "Saint Arnold",
"style": "ipa"
]
let data = try? JSONSerialization.data(withJSONObject: jsonResponse,
options: .prettyPrinted)
let jsonEncoder = JSONEncoder()
let encoded = try jsonEncoder.encode(jsonResponse)
let jsonDecoder = JSONDecoder()
let beer = try jsonDecoder.decode(Beer.self, from: data!)
print(beer)
为什么您认为
String(description:jsonResponse)
会创建一个JSON字符串?如果您使用try
/catch
而不是try
您可能会得到一个更有用的错误:)为什么您认为字符串(description:jsonResponse)
会创建一个JSON字符串?如果您使用尝试/捕获而不是尝试
您可能会得到一个更有用的错误:)您尝试从字典而不是从Beer
对象创建JSON数据是否有特定原因?您尝试从字典而不是从Beer
对象创建JSON数据是否有特定原因?