2017-02-27 17 views
1

学校では、セーリング競技を追跡するプログラムを作成しています。Swift 3 Dictionary JSON

私は現在、セーリングチーム用のGPSトラッカーアプリケーションを開発中です。 私たちのAPIに送信するには、JSONは次のようになります。

{"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}]} 

ファーストチームと配列内の位置のためのハッシュを(スマートフォン、後でそれらを送信するために、インターネット接続、ATMを持っていない場合)

私は "位置" アレイの辞書を持っている:

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) 

プリント(dataString2)の結果は次のとおりです。

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

これは正しいです。 「位置:」の後

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

が、今の結果は:ちょっと奇妙に見える:今、私はハッシュとそれを組み合わせるしたい

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

これらの追加なし」と、それは正しいだろう\けど私はちょうどこのようにそれを構築する方法を知りません。

を私はXcodeの8.2.1とスウィフト3を

答えて

3

を使用している最後の手段でJSON文字列を作る代わりに、その配列位置からJSON文字列を作成していませんそのArを設定するあなたのparams辞書で、文字列を設定する代わりにpositionsキーを使用してください。

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)! 
+0

... omg THANKS!それは今動作します:D –

+0

@SquirrelofPainようこそメイト:) –

0

プリント(dataString2)の結果は:[...]正しいあります。

彼らは数字でなければなりませんしながら、あなたは、文字列としてlatitudelongitudetimestampを直列化している第

(引用符に注意してください)。

[...]しかし後に、今の結果 "の位置は:" なぜならあなたダブル連載dataString2だこと

ちょっと奇妙に見えます。

JSONSerialization.dataを2回呼び出すのではなく、すべての構造化データを含む1つの大きなDictionary<String, Any>を作成してから、1回の呼び出しでシリアル化を実行してください。

+0

Nirav Dは、latidudeなどintのおかげでまだ高速です:)私はなぜそれらを文字列にしたかわからない –