web-dev-qa-db-fra.com

Conversion de JSON en NSData et NSData en JSON dans Swift

J'ai des problèmes pour convertir un élément JSON en NSData et une variable NSData en JSON dans Swift.

Tout d'abord, je voudrais extraire l'élément encryptedData des données JSON suivantes:

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

dans une variable NSData encryptedData mais ne semble pas pouvoir le faire. J'utilise SwiftyJSON pour analyser le JSON comme suit:

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

Mais cela me donne un tableau de ScalarNumber que je ne sais pas comment stocker dans un objet NSData.

Deuxièmement, je voudrais générer JSON en retour à partir du même objet NSData:

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

Mais l'objet NSData encryptedData n'est pas converti en [-67,51, -38,61, -72,102,48], il semble simplement annuler la chaîne JSON.

Des idées?

24
John Smith

Dans SwiftyJSON, vous pouvez utiliser la méthode rawData pour obtenir NSData:

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

Pour générer JSON comme vous le souhaitez, vous devez convertir les données en objet tableau:

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

Voici le code pour convertir entre JSON et NSData en Swift 2.0 (adapté de la réponse de 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;
}
22
Ciprian Rarau

Je n'ai aucune idée sur SwiftyJSON. J'utilise l'extrait de code suivant pour convertir entre json et 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)
}
12
Shuo

@Sunil Targe est ici la version Swift3. J'espère que cela t'aides. (Adapté de la réponse de Ciprian Rarau)

Convertir des données en JSON

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

Conversion de JSON en données

func jsonToData(json: Any) -> Data? {
    do {
        return try JSONSerialization.data(withJSONObject: json, options: JSONSerialization.WritingOptions.prettyPrinted)
    } catch let myJSONError {
        print(myJSONError)
    }
    return nil;
}
8
FromTheStix
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()

    }
}
3
Ekambaram E

Swift 4 qui fonctionne pour moi:

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