如何解析字典中包含不均匀项的Json

时间:2017-08-14 09:32:58

标签: json swift3

我想测试解析json文件。 我有以下Json文件,它在项目中存储为内部文件。

问题:

  • 房间有不均匀的物品;有些有2件,有些有3件。

如何处理此案件?

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

     }

}

由于

1 个答案:

答案 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。