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

如何从JSON字典中正确创建以数字而不是字符串开头的对象?,json,swift,Json,Swift,我很难从下面的JSON创建对象。它的格式很奇怪,有=和但这就是打印到控制台时的外观: result = ( { media = { image = { 1000 = "/assets/img/cities/basel-switzerland-1000px.jpg"; 1500 = "/assets/img/cities/basel-switzerland-1500p

我很难从下面的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_错误指令

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

无法将类型为“NSTaggedPointerString”(0x10ee4ad10)的值强制转换为 “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")
    }
  }
}

将所有出现的
[Int:Any]
替换为
[String:Any]
,并在服务器代码中进行更改。另外,正如我提到的,永远不要使用
(a as?b),而使用
a作为!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)!
  }
解析函数应该是(只是修复了一个小的、不相关的问题):


将所有出现的
[Int:Any]
替换为
[String:Any]
,并在服务器代码中进行更改。另外,正如我提到的,永远不要使用
(a as?b),而使用
a作为!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)!
  }
解析函数应该是(只是修复了一个小的、不相关的问题):


即使它们是“数字”,它们也是字符串,因为JSON中的字典键是字符串。您正在使用强制向下广播,这将引发异常。在调试器中使用no downcast和inspect来查看实际处理的内容。对您无法控制的数据(即来自web服务器的JSON数据)使用强制向下广播或强制展开会导致崩溃。使用条件强制转换/解包并更优雅地处理解析错误,是否总是这样,如果它是JSON中的一个字典键,不管它是什么,它总是一个字符串?关于键值,它们不能是字符串以外的对象吗?在JSON中不能。请参见切勿使用
(a为?b),而使用
a作为!b
。我把
(结果字典[“媒体”]看作是?[String:Any])
(mediaDictionary[“image”]作为?[Int:Any])。即使它们是“数字”,它们也是字符串,因为JSON中的字典键是字符串。您正在使用强制向下广播,这将引发异常。在调试器中使用no downcast和inspect来查看实际处理的内容。对您无法控制的数据(即来自web服务器的JSON数据)使用强制向下广播或强制展开会导致崩溃。使用条件强制转换/解包并更优雅地处理解析错误,是否总是这样,如果它是JSON中的一个字典键,不管它是什么,它总是一个字符串?关于键值,它们不能是字符串以外的对象吗?在JSON中不能。请参见切勿使用
(a为?b),而使用
a作为!b
。我把
(结果字典[“媒体”]看作是?[String:Any])
(mediaDictionary[“image”]作为?[Int:Any])。所有这些
正在等待崩溃发生。他们都需要妥善处理。@rmaddy是的,我完全同意,但这比老办法好。应该使用
guard let x=y else{…}
语句来完成,但这取决于询问者。所有这些
正在等待崩溃发生。他们都需要妥善处理。@rmaddy是的,我完全同意,但这比老办法好。应该使用
guard let x=y else{…}
语句来完成,但这取决于询问者。