gpt4 book ai didi

json - 如何使用 Codable 协议(protocol)快速构建 json 对象模型

转载 作者:行者123 更新时间:2023-11-28 06:10:40 33 4
gpt4 key购买 nike

我正在编写一个 REST Web 应用程序客户端,我使用的 JSON 如下所示:

JSON1

{
"device" : "iPhone"
"manufacturer" : "Apple"
"id" : 42

"owner" : "Steve"
}

但是 API 也可以给我这种 JSON

JSON2

{
"device" : "iPhone"
"manufacturer" : "Apple"
"id" : 42

"latitude" : 3.1415926535
"longitude" : 2.7182818284
}

所以现在在我的应用程序中我创建了一个符合 Codable 协议(protocol)的结构

struct MyStruct : Codable {
var name: String
var manufacturer: String

var owner: String?

// I prefer to use a property of type Location rather than 2 variables
var location: Location? {
guard let latitude = latitude, let longitude = longitude else {
return nil
}

return Location(latitude: latitude, longitude: longitude)
}

// Used to conform to the Codable protocol
private var latitude: Double?
private var longitude: Double?
}

struct Location {
var latitude: Double = 0.0
var longitude: Double = 0.0
}

这种架构可行,但在我看来它不是最好的或优雅的。你知道是否有更好的方法吗存在?我应该使用 2 个不同的 json 模型来代替:

struct MyStruct1 : Codable {
var name: String
var manufacturer: String
var owner: String
}

struct MyStruct2 : Codable {
var name: String
var manufacturer: String

private var latitude: Double
private var longitude: Double
}

我是 REST API 客户端的新手,这种 JSON 似乎没有使用好的架构。

最佳答案

使 ownerlatitudelongitude 属性可选。并使用 decodeIfPresent 仅在属性存在时对其进行解码。

你可以创建一个struct作为-

struct UserData: Codable {//Confroms to Codable protocol
var id: Int
var device: String
var manufacturer: String
var owner: String? = nil//Making property optional
var latitude: Double? = nil//Making property optional
var longitude: Double? = nil//Making property optional
init(from decoder: Decoder) throws {
let values = try decoder.container(keyedBy: CodingKeys.self)
id = try values.decode(Int.self, forKey: .id)
device = try values.decode(String.self, forKey: .device)
manufacturer = try values.decode(String.self, forKey: .manufacturer)
owner = try values.decodeIfPresent(String.self, forKey: .owner)
latitude = try values.decodeIfPresent(Double.self, forKey: .latitude)
longitude = try values.decodeIfPresent(Double.self, forKey: .longitude)
}
}

示例 Json:

    let jsonExample = """
{
"device" : "iPhone",
"manufacturer" : "Apple",
"id" : 42,
"owner" : "Steve"
}
""".data(using: .utf8)!
let jsonExample2 = """
{
"device" : "iPhone",
"manufacturer" : "Apple",
"id" : 42,
"latitude" : 3.1415926535,
"longitude" : 2.7182818284
}
""".data(using: .utf8)!.

用法:

    //Decode struct using JSONDecoder
let jsonDecoder = JSONDecoder()
do {
let modelResult = try jsonDecoder.decode(UserData.self,from: jsonExample2)
print("owner is \(String(describing: modelResult.owner)) - latitude is \(String(describing: modelResult.latitude)) - longitude is \(String(describing: (modelResult.longitude)))")
} catch {
print(error)
}

关于json - 如何使用 Codable 协议(protocol)快速构建 json 对象模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46797972/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com