web-dev-qa-db-fra.com

Comment créer un fichier JSON à partir d'un dictionnaire dans Swift 4?

Edit: J'ai lu les autres réponses sur SO pour le même problème, mais je ne parviens pas à obtenir le résultat souhaité. J'ai essayé de nombreuses variantes comme suggéré dans d'autres questions, mais cela ne fonctionne pas.

J'ai un JSON coupé qui doit être ajouté en tant que corps lorsque j'ouvre un websocket.

  sender: "[email protected]",
  recipients:"[email protected]",
  data: {
  text: "Test Message"
   },

Donc, en utilisant Swift j'ai fait ce qui suit,

    var messageDictionary : [String: Any] = [
        "sender": "[email protected]",
        "recipients":"[email protected]",
        "data": [
        "text": "Test Message"
        ],
    ]
    do {
        let jsonData = try JSONSerialization.data(withJSONObject: messageDictionary, options: .prettyPrinted)
        let jsonString = String(data: jsonData, encoding: String.Encoding.ascii)
        socket.write(string: jsonString!)
        print(jsonString)
    } catch {
        print(error.localizedDescription)
    }

Quand j'imprime le jsonString, je reçois

    Optional("{\n  \"sender\" : \"[email protected]\",\n  \"data\" : {\n    
    \"text\" : \"Test Message\"\n  },\n  \"recipients\" : 
    \"[email protected]\"\n}")

comme sortie de console. Je m'attendais à ce que l'extrait ci-dessus soit au format JSON. Comment obtenir la sortie en JSON normal sans le/n ni les espaces supplémentaires? J'utilise Swift 4 et Xcode 9.1

Éditer 2 :

   let jsonData = try JSONSerialization.data(withJSONObject: messageDictionary, options: [])
   let decoded = try JSONSerialization.jsonObject(with: jsonData, options: [])

J'ai essayé de faire ce qui précède et j'obtiens ce qui suit comme sortie:

    {
        data =     {
            text = Test Message;
    };
        recipients = "[email protected]";
        sender = "[email protected]";
    }

Cependant, le websocket s'attend à cela:

    { "sender":"[email protected]","recipients":
    ["[email protected]"],"data":{"text":"Test Message"}}

Même avec une légère variation telle que la perte de guillemets, le serveur websocket n’accepte pas l’entrée. Comment formater exactement le JSOn de cette façon pour que le Websocket puisse l’accepter?

4
SeaWarrior404

Après avoir essayé différentes manières, la méthode ci-dessous est ce qui a fonctionné pour moi pour obtenir le format exact requis par le serveur.

    var messageDictionary = [
        "sender":"[email protected]",
        "recipients":["[email protected]"],
        "data":[
            "text" : data
        ]
        ] as [String : Any]

        let jsonData = try! JSONSerialization.data(withJSONObject: messageDictionary)
        let jsonString = NSString(data: jsonData, encoding: String.Encoding.utf8.rawValue)
7
SeaWarrior404

De plus, vous pouvez simplement lancer sur String

let jsonData = try? JSONSerialization.data(withJSONObject: dict, options: .prettyPrinted)
let jsonString = String(data: jsonData!, encoding: .utf8)
0
Chris Peragine