在swift 4中解析JSON时出错

在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

我试图在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 = [
    "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数据是否有特定原因?