web-dev-qa-db-fra.com

Convertir un tableau en chaîne JSON en rapide

Comment convertir un tableau enJSONstring dans swift? Fondamentalement, j'ai un champ de texte avec un bouton intégré. Lorsque vous appuyez sur le bouton, le texte du champ de texte est ajouté à la variable testArray. De plus, je veux convertir ce tableau en une chaîneJSON.

C'est ce que j'ai essayé:

func addButtonPressed() {
    if goalsTextField.text == "" {
        // Do nothing
    } else {
        testArray.append(goalsTextField.text)
        goalsTableView.reloadData()
        saveDatatoDictionary()
    }
}

func saveDatatoDictionary() {
    data = NSKeyedArchiver.archivedDataWithRootObject(testArray)
    newData = NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions(), error: nil) as? NSData
    string = NSString(data: newData!, encoding: NSUTF8StringEncoding) 
    println(string)
}

Je voudrais aussi renvoyer leJSONchaîne en utilisant ma méthode savetoDictionart().

45
DrPatience

Dans l'état actuel des choses, vous le convertissez en données, puis vous tentez de convertir les données en un objet au format JSON (ce qui échoue, ce n'est pas du JSON) et vous le convertissez en chaîne, vous avez en gros un tas de transformations sans signification.

Tant que le tableau ne contient que des valeurs codables JSON (chaîne, nombre, dictionnaire, tableau, nil), vous pouvez simplement utiliser NSJSONSerialization pour le faire.

Au lieu de cela, faites simplement le tableau-> data-> parties de chaîne:

Swift 3/4

let array = [ "one", "two" ]

func json(from object:Any) -> String? {
    guard let data = try? JSONSerialization.data(withJSONObject: object, options: []) else {
        return nil
    }
    return String(data: data, encoding: String.Encoding.utf8)
}

print("\(json(from:array as Any))")

Réponse originale

let array = [ "one", "two" ]
let data = NSJSONSerialization.dataWithJSONObject(array, options: nil, error: nil)
let string = NSString(data: data!, encoding: NSUTF8StringEncoding)

bien que vous ne deviez probablement pas utiliser le déballage forcé, cela vous donne le bon point de départ.

90
David Berry

Swift 3.0 - 4.0 version

do {

    //Convert to Data
    let jsonData = try JSONSerialization.data(withJSONObject: dictionaryOrArray, options: JSONSerialization.WritingOptions.prettyPrinted)

    //Convert back to string. Usually only do this for debugging
    if let JSONString = String(data: jsonData, encoding: String.Encoding.utf8) {
       print(JSONString)
    }

    //In production, you usually want to try and cast as the root data structure. Here we are casting as a dictionary. If the root object is an array cast as [Any].
    var json = try JSONSerialization.jsonObject(with: jsonData, options: JSONSerialization.ReadingOptions.mutableContainers) as? [String: Any]


} catch {
    print(error.description)
}

L'option JSONSerialization.WritingOptions.prettyPrinted le donne au consommateur éventuel dans un format plus facile à lire s'il doit l'imprimer dans le débogueur.

Référence: Documentation Apple

L'option JSONSerialization.ReadingOptions.mutableContainers vous permet de transformer le tableau et/ou les dictionnaires retournés. 

Référence pour toutes les ReadingOptions: Documentation Apple

REMARQUE: Swift 4 peut encoder et décoder vos objets en utilisant un nouveau protocole. Voici Apples Documentation et un tutoriel quick pour un exemple de départ .

49
Jon Vogel

Si vous utilisez déjà SwiftyJSON:

https://github.com/SwiftyJSON/SwiftyJSON

Tu peux le faire:

// this works with dictionaries too
let paramsDictionary = [
    "title": "foo",
    "description": "bar"
]
let paramsArray = [ "one", "two" ]
let paramsJSON = JSON(paramsArray)
let paramsString = paramsJSON.rawString(encoding: NSUTF8StringEncoding, options: nil)

Swift 3 UPDATE

 let paramsJSON = JSON(paramsArray)
 let paramsString = paramsJSON.rawString(String.Encoding.utf8, options: JSONSerialization.WritingOptions.prettyPrinted)!

Les chaînes JSON, qui sont bonnes pour le transport, ne s'affichent pas souvent car vous pouvez encoder en JSON un corps HTTP. Multipart Post est un cas d’utilisation potentiel pour JSON stringify, qu’AlamoFire prend en charge.

19
Robert Chen

Comment convertir un tableau en json String dans Swift 2.3

var yourString : String = ""
do
{
    if let postData : NSData = try NSJSONSerialization.dataWithJSONObject(yourArray, options: NSJSONWritingOptions.PrettyPrinted)
    {
        yourString = NSString(data: postData, encoding: NSUTF8StringEncoding)! as String
    }
}
catch
{
    print(error)
}

Et maintenant, vous pouvez utiliser yourSting comme chaîne JSON. 

5
pawan gupta

Swift 2.0

var tempJson : NSString = ""
do {
    let arrJson = try NSJSONSerialization.dataWithJSONObject(arrInvitationList, options: NSJSONWritingOptions.PrettyPrinted)
    let string = NSString(data: arrJson, encoding: NSUTF8StringEncoding)
    tempJson = string! as NSString
}catch let error as NSError{
    print(error.description)
}

NOTE: - / utilisez tempJson variable lorsque vous voulez utiliser.

4
Mitul Marsoniya

Pour Swift 3.0, vous devez utiliser ceci:

var postString = ""
    do {
        let data =  try JSONSerialization.data(withJSONObject: self.arrayNParcel, options: .prettyPrinted)
        let string1:String = NSString(data: data, encoding: String.Encoding.utf8.rawValue) as! String

        postString = "arrayData=\(string1)&user_id=\(userId)&markupSrcReport=\(markup)"
    } catch {
        print(error.localizedDescription)
    }
    request.httpBody = postString.data(using: .utf8)

100% de travail testé

1
Mr.Javed Multani

Conseil: pour convertir un objet NSArray contenant des objets compatibles JSON en un objet NSData contenant un document JSON, utilisez la méthode appropriée de NSJSONSerialization. JSONObjectWithData n'est pas ça. 

Astuce 2: Vous voulez rarement ces données sous forme de chaîne; uniquement à des fins de débogage. 

1
gnasher729
extension Array where Element: Encodable {
    func asArrayDictionary() throws -> [[String: Any]] {
        var data: [[String: Any]] = []

        for element in self {
            data.append(try element.asDictionary())
        }
        return data
    }
}

extension Encodable {
        func asDictionary() throws -> [String: Any] {
            let data = try JSONEncoder().encode(self)
            guard let dictionary = try JSONSerialization.jsonObject(with: data, options: .allowFragments) as? [String: Any] else {
                throw NSError()
            }
            return dictionary
        }
}

Si vous utilisez des protocoles Codable dans vos modèles, ces extensions peuvent être utiles pour obtenir une représentation du dictionnaire ( Swift 4 )

0
mert

Vous pouvez essayer ça. 

func convertToJSONString(value: AnyObject) -> String? {
        if JSONSerialization.isValidJSONObject(value) {
            do{
                let data = try JSONSerialization.data(withJSONObject: value, options: [])
                if let string = NSString(data: data, encoding: String.Encoding.utf8.rawValue) {
                    return string as String
                }
            }catch{
            }
        }
        return nil
    }
0
kalpesh