2016-09-15 67 views
18

爲什麼下面的代碼給我的錯誤:JSONSerialization無效類型的JSON寫(_SwiftValue)

Invalid type in JSON write (_SwiftValue).

錯誤是扔在這條線:

urlRequest.httpBody = try JSONSerialization.data(withJSONObject: parameters) 

全碼:

let parameters:Parameters = ["resource":[ 
     [ 
      "appUserCode":uuidString, 
      "productNFCode": self.nfCode!, 
      "status":code, 
      "applicationKey":appDelegate.api_key 
     ] 
     ] 
    ] 
    do { 

     urlRequest.httpBody = try JSONSerialization.data(withJSONObject: parameters) 
    } catch { 
     // No-op 
    } 

回答

12

如果您的問題仍然沒有通過這裏給出的答案解決的。我相信parameters中的一個對象可能不是NSString,NSNumber,,NSDictionaryNSNull的實例。如文檔中給出了JSONSerialization類:

An object that may be converted to JSON must have the following properties:

  1. The top level object is an NSArray or NSDictionary. All objects are instances of NSString, NSNumber, NSArray, NSDictionary, or NSNull.

  2. All dictionary keys are instances of NSString. Numbers are not NaN or infinity.

  3. Other rules may apply. Calling isValidJSONObject(_:) or attempting a conversion are the definitive ways to tell if a given object can be converted to JSON data.

所以,請檢查是否有您的parameters對象的對象不滿足上述限制。

+0

在我的情況下,每個關鍵值都沒問題仍然出現此錯誤@KrishnaCA –

+0

@Mansuu ....請檢查是否有一個字符串是可選的,如下所示 – KrishnaCA

36

我有這個問題,這是因爲我的一個字符串是可選的。它試圖序列像一個值: 「可選(\」的字符串值\「)」

而是「字符串值」

+1

我也是,只是讓我的參數字符串,而不是字符串? – Gagege

+6

當你必須在你的JSON中有一個空值時,你會做什麼?根據[http://www.json.org/](http://www.json.org/),JSON可以保存空值。 – rudenudedude

+0

也解決了我的問題。我認爲這是第一次使用Swift 3的NSNull()值,但它只來自可選字符串。 – jfgrang

5

只是爲了防止任何人仍然有問題,並使用枚舉,另一個原因可能是如果您傳遞一個枚舉值,而不是它的rawValue。

例子:

enum Status: String { 
    case open 
    case closed 
} 

,而不是通過枚舉

params = ["status": Status.open] 

params = ["status": Status.open.rawValue] 
0

如果您使用SwiftyJSON訪問JSON對象時,重要的是使用JSON的屬性(而不是使用dictionaryValue,dictionary或根本不使用),因爲否則將會出現此錯誤(或其變體)。例如:

guard let jsonDict = json.dictionaryObject else { 
    return 
} 

let jsonData = try JSONSerialization.data(withJSONObject: jsonDict, options: []) 
相關問題