json - 如何从以数字而不是字符串开头的 JSON 字典正确创建对象?

标签 json swift

我很难从下面的 JSON 创建对象。它的格式很奇怪 =; 但这是打印到控制台时的样子:

 result =     (
    {
 media =             {
        image =                 {
          1000 = "/assets/img/cities/basel-switzerland-1000px.jpg";
          1500 = "/assets/img/cities/basel-switzerland-1500px.jpg";
          250 = "/assets/img/cities/basel-switzerland-250px.jpg";
          500 = "/assets/img/cities/basel-switzerland-500px.jpg";
        };
      };
}
)

我已经创建了自定义对象,但我不断收到

EXC_BAD_INSTRUCTION

当我使用 [Int: Any] 作为“图像”时出错,当我替换 NSNumber 时出现错误:

Could not cast value of type 'NSTaggedPointerString' (0x10ee4ad10) to 'NSNumber' (0x10bc88488).

这是我为 JSON 对象自定义的类:

class sampleJSON {
  var mediaDictionary: [String: Any]
  var imageDictionary: [Int: Any]
  var image: URL

  init( mediaDictionary: [String: Any], imageDictionary: [Int: Any], image: URL){
    self.mediaDictionary = mediaDictionary
    self.imageDictionary = imageDictionary
    self.image = image
  }

  init(resultsDictionary:[String: Any]){
    mediaDictionary = (resultsDictionary["media"] as? [String: Any])!
    imageDictionary = (mediaDictionary["image"] as? [Int: Any])!
    image = URL(string: imageDictionary[1000] as! String)!
  }

这就是我解析 JSON 数据的方式:

static func downloadAllData(urlExtension: String, completionHandler: @escaping (sampleJSON?) -> ()) {
    let usm = UrlSessionNetworkManager.sharedManager

    if let jsonDictionary = usm.parseJSONFromData(urlExtension:"\(urlExtension)")
    {
      let resultDictionaries = jsonDictionary["result"] as! [[String : Any]]
      for resultsDictionary in resultDictionaries {// enumerate through dictionary
        let nomadInfo = sampleJSON(resultsDictionary: resultsDictionary)

        print(nomadInfo.mediaDictionary)

        completionHandler(nomadInfo)
      }
    } else {
      print("Error: Cannot retrieve JSON Data")
    }
  }
}

最佳答案

[String: Any] 替换所有出现的 [Int: Any],并在服务器代码中也进行更改。 As mentioned by @Paulw11, JSON keys can only be strings (but a value can be a string in double quotes, or a number, or true or false or null, or an object or an array) .另外,正如我提到的,永远不要使用 (a as? b)!,而是使用 a as! b.

新的(现在有效的)JSON 应该如下所示:

 result =     (
    {
 media =             {
        image =                 {
          "1000" = "/assets/img/cities/basel-switzerland-1000px.jpg";
          "1500" = "/assets/img/cities/basel-switzerland-1500px.jpg";
          "250" = "/assets/img/cities/basel-switzerland-250px.jpg";
          "500" = "/assets/img/cities/basel-switzerland-500px.jpg";
        };
      };
}
)

自定义类应该是:

class sampleJSON {
  var mediaDictionary: [String: Any]
  var imageDictionary: [String: Any]
  var image: URL

  init( mediaDictionary: [String: Any], imageDictionary: [String: Any], image: URL){
    self.mediaDictionary = mediaDictionary
    self.imageDictionary = imageDictionary
    self.image = image
  }

  init(resultsDictionary:[String: Any]){
    mediaDictionary = resultsDictionary["media"] as! [String: Any]
    imageDictionary = mediaDictionary["image"] as! [String: Any]
    image = URL(string: imageDictionary["1000"] as! String)!
  }

解析函数应该是(只是修复了一个小的、不相关的问题):

static func downloadAllData(urlExtension: String, completionHandler: @escaping (sampleJSON?) -> ()) {
    let usm = UrlSessionNetworkManager.sharedManager

    if let jsonDictionary = usm.parseJSONFromData(urlExtension: urlExtension)
    {
      let resultDictionaries = jsonDictionary["result"] as! [[String : Any]]
      for resultsDictionary in resultDictionaries {// enumerate through dictionary
        let nomadInfo = sampleJSON(resultsDictionary: resultsDictionary)

        print(nomadInfo.mediaDictionary)

        completionHandler(nomadInfo)
      }
    } else {
      print("Error: Cannot retrieve JSON Data")
    }
  }
}

关于json - 如何从以数字而不是字符串开头的 JSON 字典正确创建对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41434480/

相关文章:

ios - 在 objective-c 中解析JSON信息(多个级别)

swift - 容器内的 ViewController - 为什么我要读取屏幕高度?

json - Codable 和 JSON 的问题

swift - 我的类(class)没有成员属性

javascript - 使用 javascript 和 json 加载表格时如何为按钮分配多个值

java - 如何为play框架添加依赖项gson

php - 使用YouTube api v3 playlistItems获取数组中的videoId列表,并构建另一个视频查询以获取统计数据viewCount

ios - 仅纵向应用程序中的 AVPlayerViewController 全屏旋转行为

ios - 使用 NSCoder 解码时崩溃

python - json.decoder.JSONDecodeError : Expecting value: line 1 column 1 (char 0) KeyError: ["Data Bytes 1: "]