【问题标题】:Error parsing JSON in swift 4在 swift 4 中解析 JSON 时出错
【发布时间】:2018-07-30 06:59:26
【问题描述】:

我正在尝试在 swift 4 中解析 JSON,但出现以下错误:

执行被中断,原因:EXC_BAD_INSTRUCTION (代码=EXC_I386_INVOP,子代码=0x0)。该过程已留在 中断点,使用“thread return -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)

【问题讨论】:

  • 你认为String(describing: jsonResponse)为什么会创建一个JSON字符串?
  • 如果你使用try/catch 而不是try! 你可能会得到一个更有用的错误:)

标签: json swift swift4 codable


【解决方案1】:

您没有正确创建 JSON 数据。 String(describing:) 不创建 JSON 字符串。它创建一个对象的调试描述,它与 JSON 没有任何关系。

与使用字典相比,从Beer 对象创建Data 然后再次反序列化它会更干净:

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)")

【讨论】:

  • 您尝试从字典而不是 Beer 对象创建 JSON 数据是否有特定原因?
【解决方案2】:

首先通过对响应进行编码来创建 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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多