如何使用 AlamoFire/ObjectMapper 访问嵌入在 JSON 字典中的链接?

Posted

技术标签:

【中文标题】如何使用 AlamoFire/ObjectMapper 访问嵌入在 JSON 字典中的链接?【英文标题】:How to access a link embedded in a JSON dictionary using AlamoFire/ ObjectMapper? 【发布时间】:2016-12-12 21:04:19 【问题描述】:

这是我正在使用的对象映射器:

ObjectMapper/AlamoFireObjctMapper

这是我正在使用的 JSON 数据,我正在尝试访问“链接”值:

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”类下的“facebookLink”作为字符串,但它一直返回零。然后我尝试使用 URLTransform 将其更改为 NSURL 类型,但现在它抛出了错误:

没有更多上下文的表达类型是模棱两可的

这是我尝试检索 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
        

  

【问题讨论】:

【参考方案1】:

尝试将链接设置为字符串

var stringURL:String?

获取链接

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

【讨论】:

好的,我知道它是如何工作的,但出于某种奇怪的原因,它一直返回 nil。 哪个返回 nil,是字符串还是 URL? 当我打印 ("This is the social info: (socialInfo?.channels?.facebookSocial?.facebookLink)") 时,它返回 nil 所以字符串返回 nil 那么 JSON 的其余部分呢,都返回 nil 吗?

以上是关于如何使用 AlamoFire/ObjectMapper 访问嵌入在 JSON 字典中的链接?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用本机反应创建登录以及如何验证会话

如何在自动布局中使用约束标识符以及如何使用标识符更改约束? [迅速]

如何使用 AngularJS 的 ng-model 创建一个数组以及如何使用 jquery 提交?

如何使用laravel保存所有行数据每个行名或相等

如何使用 Math.Net 连接矩阵。如何使用 Math.Net 调用特定的行或列?

WSARecv 如何使用 lpOverlapped?如何手动发出事件信号?