gpt4 book ai didi

使用 Decodable 协议(protocol)进行 JSON 解析

转载 作者:搜寻专家 更新时间:2023-11-01 06:53:50 25 4
gpt4 key购买 nike

我在下面有 json,我想从中解析/分配值

{
"Rooms":[
{
"id":"100",
"title":"CS Classroom",
"description":"Classroom for Computer science students",
"capacity":"50"
},
{
"id":"101",
"title":"Mechanical Lab",
"description":"Mechanical Lab work",
"capacity":"50"
},
{
"id":"108",
"title":"Computer Lab",
"description":"Computer Lab work",
"capacity":"50"
}
]
}

这个 json 是 [Dictionary: Dictonary] 类型,它只有键“Rooms”

在创建结构时我应该创建

struct RoomsInfo: Decodable {
let rooms: Rooms
}

struct Rooms {
let id: String
let title: String
let description: String
let capacity: String
}

我的第一个问题是:因为我只有 Rooms 键,是否可以只创建一个结构而不是两个?

我的第二个问题是:如果我的 json 的键为“Rooms1”、“Rooms2”、“Rooms3”、“Rooms4”...在这种情况下我可以创建确认可解码的结构还是我需要解析是手动的吗?

请多多指教

最佳答案

对于第一个问题,您有一个名为 Room 的 key ,因此它必须解码该 key ,是否有可能不确定,而不是解析 JSON 数据,首先调出该键 JSON["Rooms"] 的值,然后将其中的内容解析为[房间].self ,

对于第二个问题,如果计数是无限的,就好像你不知道Room键的计数是多少,那么Decoder的能力是有限的,但是您始终可以将值映射为 Dictionary 然后将值解码为 Room 而无需关心 key ,这个技巧可以,但您将放弃原始

第二种情况的更新:查看下面的代码。

typealias jsonDictionary = [String: Any]
let jsonData = json.data(using: .utf8)! // converting test json string to data
var arrayOfRooms: [Room] = []
do {
let serialized = try JSONSerialization.jsonObject(with: jsonData, options: []) // serializing jsonData to json object
if let objects = serialized as? [String: Any] { //casting to dictionary
for key in objects.keys { //looping into the keys rooms (n) number
let rooms = objects[key] // getting those rooms by key
let data = try JSONSerialization.data(withJSONObject: rooms!, options: []) //converting those objects to data again to parse
var myRoom = try! JSONDecoder().decode([Room].self, from: data) // decoding each array of rooms
arrayOfRooms.append(contentsOf: myRoom) // appending rooms to main rooms array declared on top
print("Data", data) // just to check
}
print("MY Array Of Rooms Count \(arrayOfRooms.count)")
} else {
print("nil")
}

} catch {

}

关于使用 Decodable 协议(protocol)进行 JSON 解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55192300/

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