2014-11-10 32 views
16

Tôi đang gặp sự cố khi chuyển đổi thành phần JSON thành NSData và biến NSData trở lại thành JSON trong Swift.Chuyển đổi JSON thành NSData và NSData thành JSON trong Swift

Đầu tiên, tôi muốn trích xuất các yếu tố 'encryptedData' của dữ liệu JSON sau:

{ 
    "transactionID" : 12345, 
    "encryptedData" : [-67,51,-38,61,-72,102,48] 
} 

thành một NSData 'encryptedData' biến nhưng dường như không thể có khả năng để làm điều đó. Tôi đang sử dụng SwiftyJSON để phân tích cú pháp JSON như sau:

let list: Array<JSON> = json["encryptedData"].arrayValue! 

Nhưng điều này cho tôi một mảng ScalarNumber mà tôi không biết cách lưu trữ vào đối tượng NSData.

Thứ hai, tôi muốn tạo JSON trở lại từ cùng một đối tượng NSData:

let jsonObject = [ 
    "transactionID" : 12345, 
    "encryptedData" : encryptedData 
] 

Nhưng đối tượng NSData 'encryptedData' không được chuyển đổi thành [-67,51, -38,61 , -72,102,48], nó dường như vô hiệu hóa chuỗi JSON.

Bất kỳ ý tưởng nào?

Cảm ơn

Trả lời

16

Trong SwiftyJSON bạn có thể sử dụng phương pháp rawData để có được NSData:

if let encryptedData:NSData = json["encryptedData"].rawData() { 
    NSLog(NSString(data: encryptedData, encoding: NSUTF8StringEncoding)!) 
} 

Để tạo JSON như bạn muốn, bạn nên chuyển đổi dữ liệu vào đối tượng mảng:

if let encryptedDataArray = JSON(data: encryptedData).arrayObject { 
    let jsonObject:JSON = [ 
     "transactionID" : 12345, 
     "encryptedData" : encryptedDataArray 
    ] 
    NSLog(NSString(data: jsonObject.rawData()!, encoding: NSUTF8StringEncoding)!) 
} 
+0

Hi Tish, cảm ơn bạn rất nhiều vì phản hồi của bạn. Thật không may SwiftyJSON không hỗ trợ 'rawValue()'. Tôi đã dự kiến ​​SwiftyJSON sẽ hỗ trợ một cái gì đó như thế này. –

+0

Nó thực hiện theo tài liệu. Nhưng rawValue không phải là một phương pháp, nó là một tài sản. Không giống như phương thức rawData() mà bạn có thể thấy trong phản hồi của tôi. Bạn có thể tìm thấy các ví dụ tại tài liệu GitHub: https://github.com/SwiftyJSON/SwiftyJSON#raw-object – Tish

10

Tôi không biết gì về SwiftyJSON. Tôi sử dụng sau đoạn mã để chuyển đổi giữa json và NSData

// Convert from NSData to json object 
public class func nsdataToJSON(data: NSData) -> AnyObject? { 
    return NSJSONSerialization.JSONObjectWithData(data, options: .MutableContainers, error: nil) 
} 

// Convert from JSON to nsdata 
public class func jsonToNSData(json: AnyObject) -> NSData?{ 
    return NSJSONSerialization.dataWithJSONObject(json, options: .allZeros, error: nil) 
} 
+0

Cảm ơn bạn đã phản hồi Shuo, tôi không chắc chắn cách sử dụng giải pháp của bạn, tức là làm cách nào để chuyển vào khóa 'encryptedData' để xác định dữ liệu tôi muốn lấy lại? Cảm ơn bạn đã giúp đỡ! –

17

đây là mã để chuyển đổi giữa JSON và NSData trong nhanh chóng 2.0 (chuyển thể từ câu trả lời của Shuo)

// Convert from NSData to json object 
func nsdataToJSON(data: NSData) -> AnyObject? { 
    do { 
     return try NSJSONSerialization.JSONObjectWithData(data, options: .MutableContainers) 
    } catch let myJSONError { 
     print(myJSONError) 
    } 
    return nil 
} 

// Convert from JSON to nsdata 
func jsonToNSData(json: AnyObject) -> NSData?{ 
    do { 
     return try NSJSONSerialization.dataWithJSONObject(json, options: NSJSONWritingOptions.PrettyPrinted) 
    } catch let myJSONError { 
     print(myJSONError) 
    } 
    return nil; 
} 
+0

Tôi cần có mã tương tự cho nhanh 3.0 –

+2

@SunilTarge Xcode thực hiện một công việc hợp lý để chuyển đổi nó cho bạn nếu bạn làm theo các cảnh báo, theo cách đó bạn cũng sẽ nhanh chóng nhận được sự khác biệt giữa Swift 2 và 3. – Leon

+0

nhưng lỗi của nó cho phép bất cứ khi nào tôi giải quyết Cảnh báo. @Leon –

4

@Sunil Targe đây là phiên bản Swift3. Hi vọng điêu nay co ich. (Phỏng theo câu trả lời Ciprian Rarau của)

Chuyển đổi dữ liệu JSON

func dataToJSON(data: Data) -> Any? { 
    do { 
     return try JSONSerialization.jsonObject(with: data, options: .mutableContainers) 
    } catch let myJSONError { 
     print(myJSONError) 
    } 
    return nil 
} 

Chuyển đổi từ JSON để dữ liệu

func jsonToData(json: Any) -> Data? { 
    do { 
     return try JSONSerialization.data(withJSONObject: json, options: JSONSerialization.WritingOptions.prettyPrinted) 
    } catch let myJSONError { 
     print(myJSONError) 
    } 
    return nil; 
} 
+1

Cảm ơn bạn. Lưu ý, điều này có thể được thực hiện trong một dòng mã, bằng cách trả về 'try?' (Đối với những người không cần in 'myJSONError'). – Frouo

-1
class ViewController: UIViewController { 

    let requestURL : NSURL = NSURL(string: "http://www.learnswiftonline.com/Samples/subway.json")! 
    let session = URLSession.shared 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     fetchData() 
    } 

    func fetchData() 
    { 
     let urlRequest: NSMutableURLRequest = NSMutableURLRequest(url: requestURL as URL) 
     let task = session.dataTask(with: urlRequest as URLRequest) { (data, response, error) -> Void in 

      let httpResponse = response as! HTTPURLResponse 
      let statusCode = httpResponse.statusCode 

      if(statusCode == 200) 
      { 
       do { 
        let jsonResponse = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers) 
        print(jsonResponse as! NSDictionary) 
       } 
       catch let error 
       { 
        print(error) 
       } 
      } 
     } 
     task.resume() 

    } 
} 
0

Swift 4 mà làm việc cho tôi:

// Convert from JSON to nsdata 
func jsonToNSData(json: AnyObject) -> NSData?{ 
    do { 
     return try JSONSerialization.data(withJSONObject: json, options: JSONSerialization.WritingOptions.prettyPrinted) as NSData 
    } catch let myJSONError { 
     print(myJSONError) 
    } 
    return nil; 
} 
Các vấn đề liên quan