【发布时间】:2016-12-12 00:54:02
【问题描述】:
我在尝试访问 JSON 字典中的字符串时遇到问题,这是 JSON 数据,我尝试访问的字符串是“链接”值:
channels = (
{
social = {
facebook = {
"facebook_id" = 47360808996;
link = "https://www.facebook.com/CBS";
};
twitter = {
link = "https://twitter.com/CBS";
"twitter_id" = 97739866;
};
};
}
);
这是我创建的自定义对象,它一直给我一个错误
“类型'(key: String, value: AnyObject)'没有下标成员”
class SocialInfo: NSObject, Mappable {
var facebook: String?
var facebookDict: String?
required init?(map: Map) {
}
func mapping(map: Map) {
///transforms string to dictionary [string: anyobject] - only used for specific JSON data name: (facebook) - (link)
let facebookTransform = TransformOf<String, [String: AnyObject]> (fromJSON: { (value: [String: AnyObject]?) -> String? in
if let value = value {
for dict in value {
if let social = dict["social"] as? NSDictionary {
if let fb = social["facebook"] as? [String: AnyObject]{
if let fbLink = fb["link"] as? String{
return fbLink
}
}
}
}
}
return nil
}, toJSON: { (value: String?) -> [String: AnyObject]? in
return nil
})
facebookDict <- (map["channels"], facebookTransform)
facebook <- map["link"]
}
}
这是我获取信息的 JSON 调用函数:
func getSocialInfo (_ completion: (([SocialInfo]) -> Void)?) {
Alamofire.request("\(baseURL)/\(apiKey)/show/950", method: .get, encoding: JSONEncoding.default).responseArray { (response: DataResponse<[SocialInfo]>) in
if let channelsResponse = response.result.value {
completion?(channelsResponse)
}
}
}
作为参考,我使用 NSURLSession 从一个工作项目中重新创建了这个,下面的代码可以工作:
if let channels = jsonResult["channels"] as? [[String:AnyObject]], !channels.isEmpty {
let channel = channels[0] // now the compiler knows it's [String:AnyObject]
let social = channel["social"] as? NSDictionary
let facebookDict = social!["facebook"] as? [String:AnyObject]
let facebook = nullToNil(facebookDict!["link"]) as? String ?? "N/A"
let twitterDict = social!["twitter"] as? [String:AnyObject]
let twitter = nullToNil(twitterDict!["link"]) as? String ?? "N/A"
【问题讨论】:
-
这甚至不是一个有效的 JSON 数据集。
-
数据是这样的,我只提取了与问题相关的部分。
-
JSON 数据集不包含分号。
-
这个可以,我知道它可以工作,因为我使用 NSURLSession 编写了项目并且工作正常。我正在尝试将其转换为使用 AlamoFire。
标签: ios swift alamofire objectmapper