Search code examples
jsonswiftnsdictionary

How to create JSON from a dictionary in Swift 4?


Edit: I have read the other answers on SO for the same issue , however Im unable to get the desired output. I have tried many variations as suggested in other questions but its not working.

I have a JSON snipped which needs to be added as the body when I open a websocket.

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

So using Swift I did the following,

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

When I print the jsonString, I get

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

as the console output. I expected the above snippet to be formatted as JSON. How to get the output as normal JSON without the /n and additional spaces? Im using Swift 4 and Xcode 9.1

Edit 2:

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

I tried doing the above and I get the following as the output:

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

However the websocket expects this:

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

Even with a slight variation like misplacing of double quotes the websocket server doesnt accept the input. How to exactly format the JSOn this way so that the websocket can accept it?


Solution

  • After trying out various ways, the below way is what worked for me for getting the exact format required by the backend.

    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)