我想测试解析json文件。 我有以下Json文件,它在项目中存储为内部文件。
问题:
如何处理此案件?
-------------- Json file:
[
{
"_id":"598f1442bf068c0b28c2f991",
"purpose":"Meeting with Jay",
"date":"2017-08-09T03:32:43.395Z",
"__v":0,
"room":{
"capacity":0,
"address":"-"
}
},
{
"_id":"598f147ebf068c0b28c2f992",
"purpose":"Presentation to mike",
"date":"2017-08-10T07:45:43.395Z",
"__v":0,
"room":{
"name":"SC-07-01",
"capacity":10,
"address":"The Hi Five"
}
},
{
"_id":"598f1508bf068c0b28c2f993",
"purpose":"Demo to users",
"date":"2017-08-11T09:00:00.000Z",
"__v":0,
"room":{
"name":"SC-08-01",
"capacity":30,
"address":"The Hi Five"
}
},
{
"_id":"598f16b3bf068c0b28c2f994",
"purpose":"Cooking with William",
"date":"2017-08-09T05:26:43.395Z",
"__v":0,
"room":{
"name":"MBC-#07-01",
"capacity":10,
"address":"Maple Tree garden"
}
}
]
- 更新 -
class RoomBooking {
var purpose:String?
var date:String? // need to take the date and hh:mm out from it
var hhmm: String?
var bookDate: String?
Var room:Room?
init(purpose:String, date:String,hhmm :String, bookDate:String, room : Room) {
self.purpose = purpose
self.date = date
self.hhmm = hhmm
self.bookDate = bookDate
self.room = room
}
}
class Room {
var name:String?
var capacity:Int?
var address:String?
}
//-1- How to iterate the room?
//-2- How to get the date and time (hh:mm) from the date Object
//-3- create an array object of RoomBooking
var rmbookingArray = [RoomBooking]()
for user in array {
if let userDict = user as? [String:Any]{
if let purpose = userDict.value(forKey: "purpose") {
return purpose as! String
}
return "No purpose enter"
}()
if let userDate = userDict.value(forKey: "date") {
return date as! String
}
return "No date enter"
}()
if let userRoom = ??
}
var roomObject = Room()
roomObject.name = userRoom["name"] as? String
roomObject.capacity = userRoom["capacity"] as? Int
roomObject.address = userRoom["address"] as? String
var rb = RoomBooking()
rb.purpose = userPurpose
rb.date = userDate
rb.room = roomObject
rmbookingArray.append(rb)
}
}
由于
答案 0 :(得分:0)
您应该创建一个其字段为可选项的类,如果缺少JSON中的某个属性,则保留值为nil。如果您期望某些缺少字段,请不要使用guard
语句,因为guard
始终退出else
子句中的范围。请改用if let
。
class RoomBooking {
var purpose:String
var date:Date
var hhmm: String
var bookDate: Date
var room:Room
init(purpose:String, date:Date,hhmm :String, bookDate:Date, room : Room) {
self.purpose = purpose
self.date = date
self.hhmm = hhmm
self.bookDate = bookDate
self.room = room
}
}
class Room {
var name:String?
var capacity:Int?
var address:String?
}
var rmbookingArray = [RoomBooking]()
for user in array {
if let userDict = user as? [String:Any]{
let df = DateFormatter()
df.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.z"
guard let userDateString = userDict["date"] as? String, let userDate = df.date(from: userDateString) else { return}
guard let userPurpose = userDict["purpose"] as? String else { return}
//-- the room contain dictionary
guard let userRoom = userDict["room"] as? [String:Any] else { return}
var roomObject = Room()
roomObject.name = userRoom["name"] as? String
roomObject.capacity = userRoom["capacity"] as? Int
roomObject.address = userRoom["address"] as? String
let bookingDateFormatter = DateFormatter()
bookingDateFormatter.dateFormat = "hhmm"
//I cannot see anything related to bookDate in your JSON, so bookDate is just a dummy variable, set it up to whatever you want to
var booking = RoomBooking(purpose: userPurpose, date: userDate, hhmm: bookingDateFormatter.string(from: bookDate), bookDate: bookDate, room: roomObject)
rmbookingArray.append(booking)
}
}
如果您以这种方式解析文件,即使缺少某些属性,您也可以解析文件的每个“room”元素,nil
只会Room
宾语。我在代码中留下了一些保护语句,因为从示例中可以看出这些字段始终存在。如果那些也可能丢失,只需将它们更改为if let
s。