SeaWarrior404
SeaWarrior404

Reputation: 4168

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?

Upvotes: 10

Views: 19609

Answers (3)

SeaWarrior404
SeaWarrior404

Reputation: 4168

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)

Upvotes: 26

flame3
flame3

Reputation: 2992

Now JSONEncoder can do the work easily.

let encoder = JSONEncoder()

encoder.outputFormatting = .prettyPrinted

let data = try encoder.encode(yourDictionary)

print(String(data: data, encoding: .utf8)!)

Upvotes: 0

Chris Peragine
Chris Peragine

Reputation: 178

Additionally, you can just cast to String

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

Upvotes: 1

Related Questions