为啥我收到“JSON 字典中的无效(非字符串)键”错误消息?

Posted

技术标签:

【中文标题】为啥我收到“JSON 字典中的无效(非字符串)键”错误消息?【英文标题】:Why am I am getting an "Invalid (non-string) key in JSON dictionary" error message?为什么我收到“JSON 字典中的无效(非字符串)键”错误消息? 【发布时间】:2020-11-12 17:01:18 【问题描述】:

我正在尝试使用 Swift 创建对图像的引用,并使用字典和 JSON 将其存储在文档中。我相信我根据another SO answer that I found 为字典创建了正确的语法。当我按下功能为addButtonClicked 的按钮时,会出现以下错误消息。我做错了什么?

错误信息:

JSON 字典中的无效(非字符串)键

// Inside UICollectionViewCell 
var representedAssetIdentifier: String? = nil

// Inside  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 report: \(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
      
  

【问题讨论】:

【参考方案1】:

错误信息很清楚。您不能使用具有整数键的字典创建 JSON 字符串。你需要使用字符串。

注意:与您的问题无关,但您不应将任何文件直接写入应用程序支持目录:

使用此目录来存储除与用户文档相关联的所有应用程序数据文件。例如,您可以使用此目录来存储应用程序创建的数据文件、配置文件、模板或其他由应用程序管理的固定或可修改资源。应用程序可能会使用此目录来存储最初包含在应用程序包中的资源的可修改副本。游戏可能会使用此目录来存储用户购买并从服务器下载的新关卡。 此目录中的所有内容都应放在一个自定义子目录中,该子目录的名称是您的应用程序包标识符或您的公司的名称。 在 ios 中,此目录的内容由 iTunes 和 iCloud 备份。

File System Basics

【讨论】:

这就是我认为错误消息所说的内容,但是在我与我的 OP 一起发布的链接中,有很多人使用 [Int:String] 组合的例子。他们是怎么做到的? 您可以使用任何符合Hashable 协议的键在 Swift 中创建字典,但除非您将键从 Int 转换为 String,否则无法从中创建 JSON。我还会添加一个字符前缀,例如"k1""k2" 等等。

以上是关于为啥我收到“JSON 字典中的无效(非字符串)键”错误消息?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我不断收到 OverwriteModelError?

为啥我收到 NullPointerException 错误

为啥我收到 AuthenticationCredentialsNotFoundException?

为啥我收到的 jwt 格式错误?

为啥我收到“无法解析 NSPredicate”错误

为啥我收到 AbstractDynamicObject$CustomMessageMissingMethodException 错误?