用Codable解码这种JSON
我有一个json,看起来像这样:用Codable解码这种JSON,json,swift,codable,Json,Swift,Codable,我有一个json,看起来像这样: let jsonString = """ { "data": [ { "name": "Apple", "price": 44, "available": true }, { "name": "Pear", "price": 27, "available": fal
let jsonString = """
{
"data": [
{
"name": "Apple",
"price": 44,
"available": true
},
{
"name": "Pear",
"price": 27,
"available": false
}
],
"some_stuff": [],
"some_other_stuff": []
}"""
我的目标是解析数据
数组的内容,特别是在一个不关心可用性
属性的结构中。我不关心返回的一些东西
和一些其他东西
就是json
- 第一个问题:如果这些属性是与我感兴趣的“数据”处于同一级别的响应的一部分,我可以忽略它们吗?如果是这样,我如何表示我忽略的类型的空数组,因为我只得到空数组?(对于这一部分,我选择将其表示为任意选择类型Int的数组?)
struct Fruit: Codable {
let name: String
let price: Int
}
以及上面的一种超级结构:
struct WholeResponse: Codable {
let data: [Fruit]
let someStuff: [Int?]
let someOtherStuff: [Int?]
enum CodingKeys: String, CodingKey {
case data
case someStuff = "some_stuff"
case someOtherStuff = "some_other_stuff"
}
struct Fruit: Codable {
let name: String
let price: Int
}
init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
let data = try container.nestedContainer(keyedBy: CodingKeys.self, forKey: .data)
name = try data.decode(String.self, forKey: .name)
price = try data.decode(Int.self, forKey: .price)
}
func encode(to encoder: Encoder) throws {
var container = encoder.container(keyedBy: CodingKeys.self)
var data = container.nestedContainer(keyedBy: CodingKeys.self, forKey: .data)
try data.encode(name, forKey: .name)
try data.encode(price, forKey: .price)
}
}
但我发现自己在做了这件事后陷入了困境:
let jsonData = jsonString.data(using: .utf8)!
let jsonDecoder = JSONDecoder()
let fruits = try jsonDecoder.decode(WholeResponse.self, from: jsonData)
我想我遗漏了一些关于数据表示的信息,这可能会使事情变得复杂,但是你能帮我解析这个数据数组吗?首先删除所有你不想要的内容:
struct WholeResponse: Codable {
let data: [Fruit]
struct Fruit: Codable {
let name: String
let price: Int
}
}
然后,和你以前一样,说
let response = try jsonDecoder.decode(WholeResponse.self, from: jsonData)
let fruits = response.data
首先,删除所有您不想要的内容:
struct WholeResponse: Codable {
let data: [Fruit]
struct Fruit: Codable {
let name: String
let price: Int
}
}
然后,和你以前一样,说
let response = try jsonDecoder.decode(WholeResponse.self, from: jsonData)
let fruits = response.data
如果您不关心
someStuff
和someOtherStuff
,那么只需删除结构中声明属性的let
行即可。您还可以从和中删除initFrom
和decode
,因为正确的事情会自动发生。如果您不关心someStuff
和someOtherStuff
,那么只需删除结构中声明属性的let
行即可。您还可以从和解码中删除您的初始化,因为正确的事情会自动发生。