2016-09-15 18 views
18

Tại sao đoạn mã sau cho tôi lỗi:JSONSerialization không hợp lệ trong JSON ghi (_SwiftValue)

Invalid type in JSON write (_SwiftValue).

Các lỗi được ném vào dòng này:

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

Full mã:

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 
    } 

Trả lời

12

Nếu vấn đề của bạn vẫn chưa được giải quyết bằng các câu trả lời đưa ra ở đây. Tôi tin rằng một trong các đối tượng của bạn bên trong parameters có thể không phải là một phiên bản của NSString, NSNumber, NSArray, NSDictionary hoặc NSNull. Như trình bày trong tài liệu cho JSONSerialization lớp:

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.

Vì vậy, hãy kiểm tra nếu có của các đối tượng trong đối tượng parameters của bạn không đáp ứng được những hạn chế trên.

+0

Mọi giá trị quan trọng đều tốt trong trường hợp của tôi, tôi vẫn gặp lỗi này @KrishnaCA –

+0

@Mansuu .... vui lòng kiểm tra xem liệu chuỗi của bạn có phải là tùy chọn như được đưa ra dưới đây hay không – KrishnaCA

36

Tôi gặp sự cố này và đó là do một trong các chuỗi của tôi là Tùy chọn. Nó đã cố gắng để serialize một giá trị như: "Tùy chọn (\" chuỗi giá trị \ ")"

Thay vì "chuỗi giá trị"

+1

Tôi cũng vậy, chỉ cần tạo tham số String thay vì String ?. – Gagege

+6

Bạn sẽ làm gì khi phải có giá trị null trong JSON? Theo [http://www.json.org/](http://www.json.org/), một JSON có thể chứa các giá trị null. – rudenudedude

+0

Giải quyết được sự cố của tôi. Tôi nghĩ rằng đó là lần đầu tiên NSNull() giá trị với Swift 3 nhưng nó chỉ đến từ một chuỗi tùy chọn. – jfgrang

5

Chỉ trong trường hợp bất kỳ ai vẫn gặp sự cố và đang sử dụng Enums, nguyên nhân khác có thể là nếu bạn đang chuyển giá trị Enum chứ không phải rawValue.

Ví dụ:

enum Status: String { 
    case open 
    case closed 
} 

thay vì đi qua các enum:

params = ["status": Status.open] 

qua

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

Nếu bạn đang sử dụng SwiftyJSON để truy cập đối tượng JSON, điều quan trọng là sử dụng thuộc tính dictionaryObject của JSON (thay vì sử dụng dictionaryValue, dictionary hoặc không có gì), vì bạn sẽ gặp lỗi này (hoặc biến thể của nó). Ví dụ:

guard let jsonDict = json.dictionaryObject else { 
    return 
} 

let jsonData = try JSONSerialization.data(withJSONObject: jsonDict, options: []) 
Các vấn đề liên quan