2016-09-15 34 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: []) 
相关问题