対象者:SwiftのDictionary型に馴染みがない人。
記事を書いた経緯:Flutterアプリにおいて、Swift -> Dartにデータを送信する際に、Dictionary型でまとめたデータをJSON形式で送りたい。躓きポイントが2つあったので忘れないうちに共有しよう!
躓きポイント1:単純にDictionary型をJSON形式でエンコードしてDart側に送信すると配列?に変換されてしまう。
躓きポイント2:Dictionary型のキーがString型以外だとエラーでクラッシュする。こんな感じ -> *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Invalid (non-string) key in JSON dictionary' ***
対処法
private var mDicData: [Int64: Int] = [:]
func changeDicToJson() {
//mDicDataにデータを入れる処理...
//そのあと単純にdicDataに値を格納する
var jsonStru = JSONStru()
jsonStru.dicData = mDicData
do {
//Data型に変換
let data = try JSONEncoder().encode(jsonStr)
//JSON形式のString型に変換
if let jsonString = String(data: data, encoding: .utf8) {
//Flutter側にデータを送る処理など...
}
} catch {
print("エラー: \(error)")
}
}
struct JSONStru: Codable {
var dicData: [Int64: Int]?
}
これだとDictionary型が配列?になってしまう...
エンコードする前に、下記のようにString型をキーとするDictionary型に変換することで解決!
キーをString型にしないと躓きポイント2に遭遇するので注意。
var stringKeyDictionary: [String: Int] = [:]
for (key, value) in mDicData {
stringKeyDictionary[String(key)] = value
}
jsonStru.dicData = stringKeyDictionary
struct JSONStru: Codable {
var dicData: [String: Int]?
}