2017-08-14 5 views
0

jsonファイルの解析をテストしたかったのですが、 プロジェクトに内部ファイルとして保存する以下の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) 

    } 

} 

おかげ

+0

デフォルトでは、アイテムにアイテムがない場合は、3つのアイテムを持つことができます。これにより、解析の問題が改善されるはずです – Lamar

+0

どうすればいいですか?私は迅速かつjsonにはかなり新しいです。部屋には3があり、それに2が含まれていることを知る方法は? – MilkBottle

+0

たとえば、あなたの最初のオブジェクトにあなたがどのように ""アドレスを持っているかを見てみましょう。 " - " '、あなたがこの人の住所を持っていないということでした。あなたが解析しているときに、 '-'がこのユーザのアドレスに対して何も表示しないと言うことができます。 – Lamar

答えて

0

あなただけ残して、フィールドでoptionalsとあれば、あなたのJSONのプロパティの1が欠落しているクラスを作成する必要があります値はゼロです。フィールドが不足していると予想される場合は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なります。この例では、これらのフィールドが常に存在するように見えるので、私はコードにいくつかのガードステートメントを残しました。それらも欠落している場合は、if letに変更してください。

+0

私にしばらくお待ちください、私はここに戻ってきます。ソリューションが機能しているはずです。私は今それに取り組んでいます。 – MilkBottle

+0

jsonには、 "date": "2017-08-09T03:32:43.395Z"のような日付があります。文字列の日付をDateに変換し、hh:mmのようにyyyy mm ddとhour minのように日付を取ります。 var hhmm:stringのようなクラスに追加する必要があるのは何ですか? – MilkBottle

+0

@MilkBottleは、日付文字列を 'Date'オブジェクトに解析することで私の答えを更新しました。別の文字列表現に変換するには、別のdateformatで 'DateFormatter'を使用してください。 –

関連する問題