我很难从下面的 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/