如何从JSON字典中正确创建以数字而不是字符串开头的对象?
我很难从下面的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
=
和代码>但这就是打印到控制台时的外观:
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{…}
语句来完成,但这取决于询问者。