在Jift中将JSON转换为NSData,将NSData转换为JSON

时间:2022-09-15 12:36:30

I'm having problems converting a JSON element into NSData, and an NSData variable back into JSON in Swift.

我在将JSON元素转换为NSData时遇到问题,并且在Swift中将NSData变量转换回JSON。

Firstly, I'd like to extract the 'encryptedData' element of the following JSON data:

首先,我想提取以下JSON数据的'encryptedData'元素:

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

into an NSData 'encryptedData' variable but can't seem to be able to do it. I'm using SwiftyJSON to parse the JSON as follows:

进入一个NSData'encryptedData'变量,但似乎无法做到这一点。我正在使用SwiftyJSON来解析JSON,如下所示:

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

But this give me an array of ScalarNumber which I don't know how to store into an NSData object.

但这给了我一个ScalarNumber数组,我不知道如何存储到NSData对象中。

Secondly, I'd like to generate JSON back from the same NSData object:

其次,我想从同一个NSData对象生成JSON:

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

But the NSData 'encryptedData' object doesn't get converted into [-67,51,-38,61,-72,102,48], it just seems to nullify the JSON string.

但NSData'enatedData'对象没有转换为[-67,51,-38,61,-72,102,48],它似乎使JSON字符串无效。

Any ideas?

有任何想法吗?

6 个解决方案

#1


17  

In SwiftyJSON you can use rawData method to get NSData:

在SwiftyJSON中,您可以使用rawData方法获取NSData:

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

To generate JSON as you want you should convert data to array object:

要根据需要生成JSON,您应该将数据转换为数组对象:

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

#2


18  

Here is code to convert between JSON and NSData in swift 2.0 (adapted from Shuo's answer)

这是在swift 2.0中转换JSON和NSData的代码(改编自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;
}

#3


10  

I have no idea on SwiftyJSON. I use following code snippet to convert between json and nsdata

我不知道SwiftyJSON。我使用以下代码片段在json和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)
}

#4


6  

@Sunil Targe here is the Swift3 version. Hope this helps. (Adapted from Ciprian Rarau's answer)

@Sunil Targe这里是Swift3版本。希望这可以帮助。 (改编自Ciprian Rarau的答案)

Convert data to JSON

将数据转换为JSON

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

Convert from JSON to data

从JSON转换为数据

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

#5


1  

Swift 4 that works for me:

Swift 4对我有用:

// 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;
}

#6


0  

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()

    }
}

#1


17  

In SwiftyJSON you can use rawData method to get NSData:

在SwiftyJSON中,您可以使用rawData方法获取NSData:

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

To generate JSON as you want you should convert data to array object:

要根据需要生成JSON,您应该将数据转换为数组对象:

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

#2


18  

Here is code to convert between JSON and NSData in swift 2.0 (adapted from Shuo's answer)

这是在swift 2.0中转换JSON和NSData的代码(改编自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;
}

#3


10  

I have no idea on SwiftyJSON. I use following code snippet to convert between json and nsdata

我不知道SwiftyJSON。我使用以下代码片段在json和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)
}

#4


6  

@Sunil Targe here is the Swift3 version. Hope this helps. (Adapted from Ciprian Rarau's answer)

@Sunil Targe这里是Swift3版本。希望这可以帮助。 (改编自Ciprian Rarau的答案)

Convert data to JSON

将数据转换为JSON

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

Convert from JSON to data

从JSON转换为数据

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

#5


1  

Swift 4 that works for me:

Swift 4对我有用:

// 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;
}

#6


0  

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()

    }
}