Squirrel of Pain
Squirrel of Pain

Reputation: 13

Swift 3 Dictionary JSON

in school we're creating a program to track Sailing Races.

I'm currently developing the GPS Tracker App for the sailing teams. The JSON to send to our Api must look like this:

{"hash":"asdh832","positions":[{"longitude":13.340532999999999,"latitude":52.4965431,"time":1488182463461},{"longitude":13.3175489,"latitude":52.4927039,"time":1488195535705},{"longitude":13.3175489,"latitude":52.4927039,"time":1488195536657}]}

First the Hash for the Team and positions in a Array(if the smartphone doesn't have a internet connection atm to send them later)

I have a "positions" Array Dictionary:

    var positions = Array<Dictionary<String,String>>()
            positions.append(   ["longitude":String(location.coordinate.longitude),
                                 "latitude":String(location.coordinate.latitude),
                                 "time":String(Int64(location.timestamp.timeIntervalSince1970 * 1000.0))])

// Times 2 to test
            positions.append(   ["longitude":String(location.coordinate.longitude),
                                 "latitude":String(location.coordinate.latitude),
                                 "time":String(Int64(location.timestamp.timeIntervalSince1970 * 1000.0))])

    let data2 = try JSONSerialization.data(withJSONObject: positions, options: [])
                let dataString2 = String(data: data2,encoding: String.Encoding.utf8)!
                print(dataString2)

The Result of print(dataString2) is:

[{"latitude":"52.4965211222075","longitude":"13.3405919673345","time":"1488194768467"},{"latitude":"52.4965211222075","longitude":"13.3405919673345","time":"1488194768467"}]

which is correct. Now I want to combine it with a the Hash:

let params: Dictionary<String, String> = ["hash":"asdh832","positions": dataString2]
            let data = try JSONSerialization.data(withJSONObject: params , options: [])
            let dataString = String(data: data,encoding: String.Encoding.utf8)!

but the now the result after "positions:" looks kinda weird:

{"hash":"asdh832","positions":"[{\"latitude\":\"52.4966040328522\",\"longitude\":\"13.3402242104124\",\"time\":\"1488195406482\"},{\"latitude\":\"52.4966040328522\",\"longitude\":\"13.3402242104124\",\"time\":\"1488195406482\"}]"}

without these extra " and \ it would be correct but I just don't know how to build it like this.

I'm using Swift 3 with Xcode 8.2.1

Upvotes: 1

Views: 876

Answers (2)

Nikolai Ruhe
Nikolai Ruhe

Reputation: 81878

The Result of print(dataString2) is: [...] which is correct.

No.

You're serialising latitude, longitude and timestamp as strings, while they should be numbers (notice the quotes).

[...] but the now the result after "positions:" looks kinda weird

That's because you double serialise dataString2.

Do not call JSONSerialization.data twice but create one big Dictionary<String, Any> that contains all structured data and then perform the serialisation in one call.

Upvotes: 0

Nirav D
Nirav D

Reputation: 72460

Make JSON string at last means don't create JSON string from Array positions instead of that set that Array with your params dictionary with key positions instead of setting string.

var positions = Array<Dictionary<String,String>>()
positions.append(["longitude":String(location.coordinate.longitude),
                  "latitude":String(location.coordinate.latitude),
                  "time":String(Int64(location.timestamp.timeIntervalSince1970 * 1000.0))])


positions.append(["longitude":String(location.coordinate.longitude),
                  "latitude":String(location.coordinate.latitude),
                  "time":String(Int64(location.timestamp.timeIntervalSince1970 * 1000.0))])

//Now set this positions array with positions key in params dictionary
let params: Dictionary<String, Any> = ["hash":"asdh832","positions": positions]
let data = try JSONSerialization.data(withJSONObject: params , options: [])
let dataString = String(data: data,encoding: String.Encoding.utf8)!

Upvotes: 3

Related Questions