为什么我收到一个“JSON字典中的无效(非字符串)键”错误消息?
为什么我收到一个“JSON字典中的无效(非字符串)键”错误消息?
我正在尝试使用Swift创建一个对图像的引用,并将其存储在文档中,使用字典和JSON。我相信我根据我找到的另一个SO答案创建了正确的字典语法。当我点击具有函数addButtonClicked
的按钮时,出现了下面的错误消息。我做错了什么?
错误消息:
JSON字典中的无效(非字符串)键
// 在UICollectionViewCell中
var representedAssetIdentifier: String? = nil
// 在UIViewController中
var count: Int = 0
var dictionary: [Int:String] = [:]
@objc func addButtonClicked() {
do {
let fileURL = try FileManager.default
.url(for: .applicationSupportDirectory, in: .userDomainMask, appropriateFor: nil, create: true)
.appendingPathComponent("example.json")
try JSONSerialization.data(withJSONObject: dictionary).write(to: fileURL)
} catch {
print("错误报告:\(error.localizedDescription)")
}
let newViewController = PickerTest3()
self.navigationController?.pushViewController(newViewController, animated: true)
}
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
if let cell = collectionView.cellForItem(at: indexPath) as? ImageCell {
let newCount = count
dictionary.updateValue(cell.representedAssetIdentifier!, forKey: newCount)
count += 1
selectedCells.append(indexPath)
cell.index = selectedCells.count
}
}
为什么我会收到“Invalid (non-string) key in JSON dictionary”错误消息?
这个错误消息非常清楚。你不能使用具有整数键的字典创建JSON字符串,你需要使用字符串。
注意:与你的问题无关,但你不应该直接将文件写入应用程序支持目录:
使用该目录存储除与用户文档相关的文件以外的所有应用程序数据文件。例如,你可以使用该目录存储应用程序创建的数据文件、配置文件、模板或其他由应用程序管理的固定或可修改的资源。应用程序可以使用该目录来存储最初包含在应用程序包中的资源的可修改副本。游戏可以使用该目录来存储用户购买并从服务器下载的新级别。
该目录中的所有内容都应该放在一个自定义子目录中,其名称是你的应用程序的包标识符或你的公司的名称。
在iOS中,该目录的内容由iTunes和iCloud备份。
以上是我认为错误消息所说的内容,但在我发布原始问题的链接中,有很多人使用[Int:String]的组合。他们是怎么做到的呢?
你可以在Swift中创建一个具有符合Hashable协议的任何键的字典,但是除非你将键从Int转换为String,否则无法从中创建JSON。我还建议在前面添加一个字符前缀,如"k1"、"k2"等等。