2016-12-24 58 views
2

我在下面的格式已經JSON數據ManagedObject可選參數:轉換JSON在迅速

{ 
    "AvailToDate": "2016-12-31 00:00:00.0", 
    "CompanyName": "Google", 
    "ShowroomName": "Mobile Phones", 
    "OwnerUserId": "OID1544234", 
    "PartyId": "APL026306123", 
    "Currency": "USD", 
    "ProductCount": 10, 
    "AvailFromDate": "2016-12-20 00:00:00.0", 
    "MaxPrice": 10, 
    "MinPrice": 1, 
    "ShowroomId": 11904, 
    "AccessStatus": "Open" 
    } 

我能上述對象數組轉換成字典對象的數組。然後我將字典對象轉換爲核心數據實體。

這裏是我的代碼Dictionary對象轉換爲ManagedObject

let showroom = Showroom(context: bgContext) 

showroom.availableFromDate = (tShowroom[kAvailFromDate] as? String)?.toDate() 
showroom.minPrice = tShowroom[kMinPrice] as? Float 
showroom.showroomID = tShowroom[kShowroomId] as! Int32 
showroom.accessStatus = tShowroom[kAccessStatus] as? String 
showroom.availableToDate = (tShowroom[kAvailToDate] as? String)?.toDate() 
showroom.companyName = tShowroom[kCompanyName] as? String 
showroom.showroomName = tShowroom[kShowroomName] as? String 
showroom.ownerID = tShowroom[kOwnerUserId] as? String 
showroom.partyID = tShowroom[kPartyId] as? String 
showroom.currency = tShowroom[kCurrency] as? String 
showroom.productsCount = tShowroom[kProductCount] as! Int32 
showroom.maxPrice = tShowroom[kMaxPrice] as? Float 

如果某些參數缺少JSON收到,我們如何能夠解析的對象。我是否必須將我的ManagedObject中的所有參數設置爲可選? 我不想爲每個參數使用「if let」或「guard」。什麼是實現它的最好方法?

+0

如果您不想使用「if let」和「guard」,那麼您可以將每個參數聲明爲Optional ?.但我通常更喜歡使用「如果讓」和「警惕」,它將提供安全且無崩潰的代碼。 –

回答

0

你可以簡單地「默認值」使用??語法添加到變量

比方說您希望最小价格設定爲10.2,如果沒有從JSON返回一個值,像這樣做:

showroom.minPrice = tShowroom[kMinPrice] as? Float ?? 10.2 

或者字符串:

showroom.accessStatus = tShowroom[kAccessStatus] as? String ?? "Default String" 
+0

但在我的情況下,我沒有默認值。 – Satyam

+0

然後爲int設置它爲0,爲字符串將它設置爲「」 –

+0

仍然選項如日期將失敗。如果我們設置了某個日期,它至少會失敗一次。布爾也不會工作,因爲它只有2個州。它可能不是一個具體的解決方案。 – Satyam

0

我會推薦給每一個參數設置爲optionalShowroom模型。這樣更安全。另外,您可以爲您的模型引入一些轉換相關的類,您將在那裏執行guard - if let檢查,並且您只需處理錯誤。

類似如下:

import Foundation 
import UIKit 

enum DictionaryParseError: Error { 
    case missingKey 
    case invalidType 
} 

extension Dictionary where Key: ExpressibleByStringLiteral { 

    // You are expecting an optinal string 
    func string(key: Key) -> String? { 
     return self[key] as? String 
    } 

    // You are expecting an optinal float 
    func float(key: Key) -> Float? { 
     return self[key] as? Float 
    } 

    // You are expecting a string 
    func requiredString(key: Key) throws -> String { 
     let string = try self.requiredValue(key) as String 
     return string 
    } 

    // You are expecting a float 
    func requiredFloat(key: Key) throws -> Float { 
     let float = try self.requiredValue(key) as Float 
     return float 
    } 

    private func requiredValue<Type>(_ key: Key) throws -> Type { 
     guard let value = self[key] else { 
      throw DictionaryParseError.missingKey 
     } 
     guard let typedValue = value as? Type else { 
      throw DictionaryParseError.invalidType 
     } 
     return typedValue 
    } 
} 
0

如果你沒有爲管理對象的屬性的一個值,你有兩個選擇:

  • 不要設置爲任意值財產,保留爲零。這要求在數據模型中將該屬性聲明爲可選。這裏的可選項特別意味着該屬性被允許沒有價值。
  • 如果您沒有要分配的特定值,請設置一些默認值。

您做出的選擇完全取決於您計劃如何使用數據以及是否存在任何合理的默認值。您不必以同樣的方式處理所有財產。