如何使用 AlamoFire/ObjectMapper 访问嵌入在 JSON 字典中的 link?
How to access a link embedded in a JSON dictionary using AlamoFire/ ObjectMapper?
这是我正在使用的对象映射器:
ObjectMapper / AlamoFireObjctMapper
这是我正在处理的 JSON 数据,我正在尝试访问 "link" 值:
channels = (
{
social = {
facebook = {
"facebook_id" = 47360808996;
link = "https://www.facebook.com/CBS";
};
twitter = {
link = "https://twitter.com/CBS";
"twitter_id" = 97739866;
}
}
}
)
我创建了自定义对象来表示 JSON 词典的每个级别:
class SocialInfo: Mappable {
var channels: Social?
required init?(map: Map) {
}
func mapping(map: Map) {
channels <- map["channels"]
}
}
class Social: Mappable {
var facebookSocial: Facebook?
var twitterSocial: Twitter?
required init?(map: Map) {
}
func mapping(map: Map) {
facebookSocial <- map["facebook"]
twitterSocial <- map["twitter"]
}
}
class Facebook: Mappable {
var facebookLink: NSURL?
required init?(map: Map) {
}
func mapping(map: Map) {
facebookLink <- (map["link"], URLTransform())
}
}
最初我在 "Facebook" class 下有 "facebookLink" 作为字符串,但它一直返回 nil。然后我尝试 URLTransform 将其更改为一种 NSURL 但现在它抛出错误:
Type of expression is ambiguous without more context
以下是我尝试检索 JSON 数据的方式:
func getSocialInfo (completionHandler: @escaping (SocialInfo?, Error?) -> ()){
Alamofire.request("\(baseURL)/\(apiKey)/show/950", method: .get, encoding: JSONEncoding.default).validate ()
.responseObject{ (response: DataResponse<SocialInfo>) in
switch response.result {
case .success:
let socialInfo = response.result.value
print("This is the social info: \(socialInfo?.channels?.facebookSocial?.facebookLink)")
completionHandler(socialInfo!, nil)
case .failure(let error):
print("Sorry there was an error: \(error)")
completionHandler(nil,error)
return
}
}
}
尝试将 link 设置为字符串
var stringURL:String?
获取link
stringURL <- map["link"]
将 stringURL
转换为 URL
if let url = URL(string: stringURL) {
// do something
}
此外,请注意,这将不起作用,因为您特别说 facebookDictionary
是您的 Facebook
对象的 =。
class Social: Mappable {
var facebookSocial: Facebook?
var twitterSocial: Twitter?
fileprivate var facebookDictionary:[AnyHashable:Any]?
fileprivate var twitterDictionary:[AnyHashable:Any]?
required init?(map: Map) {
}
func mapping(map: Map) {
facebookDictionary <- map["facebook"]
twitterDictionary <- map["twitter"]
if let _facebookDictionary = facebookDictionary,
let _twitterDictionary = wittertDictionary {
let twitterMap = Map(mappingType: .fromJSON, JSON: _twitterDictionary)
let facebookMap = Map(mappingType: .fromJSON, JSON: _facebookDictionary)
/// Here you can initiate both object using map.
facebookSocial = Facebook(map: facebookMap)
twitterSocial = Twitter(map: twitterMap)
/// If you want to use mapping function, set this as:
facebookSocial = Facebook()
twitterSocial.mapping(map: twitterMap)
facebookSocial = Facebook()
twitterSocial.mapping(map: twitterMap)
}
}
}
由于您没有使用社交词典创建新地图,因此两个对象将始终 nil
与 Social 相同,首先从 Social dictionary
.
创建一个 map
这是我正在使用的对象映射器:
ObjectMapper / AlamoFireObjctMapper
这是我正在处理的 JSON 数据,我正在尝试访问 "link" 值:
channels = (
{
social = {
facebook = {
"facebook_id" = 47360808996;
link = "https://www.facebook.com/CBS";
};
twitter = {
link = "https://twitter.com/CBS";
"twitter_id" = 97739866;
}
}
}
)
我创建了自定义对象来表示 JSON 词典的每个级别:
class SocialInfo: Mappable {
var channels: Social?
required init?(map: Map) {
}
func mapping(map: Map) {
channels <- map["channels"]
}
}
class Social: Mappable {
var facebookSocial: Facebook?
var twitterSocial: Twitter?
required init?(map: Map) {
}
func mapping(map: Map) {
facebookSocial <- map["facebook"]
twitterSocial <- map["twitter"]
}
}
class Facebook: Mappable {
var facebookLink: NSURL?
required init?(map: Map) {
}
func mapping(map: Map) {
facebookLink <- (map["link"], URLTransform())
}
}
最初我在 "Facebook" class 下有 "facebookLink" 作为字符串,但它一直返回 nil。然后我尝试 URLTransform 将其更改为一种 NSURL 但现在它抛出错误:
Type of expression is ambiguous without more context
以下是我尝试检索 JSON 数据的方式:
func getSocialInfo (completionHandler: @escaping (SocialInfo?, Error?) -> ()){
Alamofire.request("\(baseURL)/\(apiKey)/show/950", method: .get, encoding: JSONEncoding.default).validate ()
.responseObject{ (response: DataResponse<SocialInfo>) in
switch response.result {
case .success:
let socialInfo = response.result.value
print("This is the social info: \(socialInfo?.channels?.facebookSocial?.facebookLink)")
completionHandler(socialInfo!, nil)
case .failure(let error):
print("Sorry there was an error: \(error)")
completionHandler(nil,error)
return
}
}
}
尝试将 link 设置为字符串
var stringURL:String?
获取link
stringURL <- map["link"]
将 stringURL
转换为 URL
if let url = URL(string: stringURL) {
// do something
}
此外,请注意,这将不起作用,因为您特别说 facebookDictionary
是您的 Facebook
对象的 =。
class Social: Mappable {
var facebookSocial: Facebook?
var twitterSocial: Twitter?
fileprivate var facebookDictionary:[AnyHashable:Any]?
fileprivate var twitterDictionary:[AnyHashable:Any]?
required init?(map: Map) {
}
func mapping(map: Map) {
facebookDictionary <- map["facebook"]
twitterDictionary <- map["twitter"]
if let _facebookDictionary = facebookDictionary,
let _twitterDictionary = wittertDictionary {
let twitterMap = Map(mappingType: .fromJSON, JSON: _twitterDictionary)
let facebookMap = Map(mappingType: .fromJSON, JSON: _facebookDictionary)
/// Here you can initiate both object using map.
facebookSocial = Facebook(map: facebookMap)
twitterSocial = Twitter(map: twitterMap)
/// If you want to use mapping function, set this as:
facebookSocial = Facebook()
twitterSocial.mapping(map: twitterMap)
facebookSocial = Facebook()
twitterSocial.mapping(map: twitterMap)
}
}
}
由于您没有使用社交词典创建新地图,因此两个对象将始终 nil
与 Social 相同,首先从 Social dictionary
.
map