如何使用 Alamofire/ObjectMapper 返回嵌入在字典中的 JSON 字符串?

Posted

技术标签:

【中文标题】如何使用 Alamofire/ObjectMapper 返回嵌入在字典中的 JSON 字符串?【英文标题】:How to return a JSON string embedded in a dictionary using Alamofire/ ObjectMapper? 【发布时间】: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。 【参考方案1】:

我假设您使用 Swift 3,因为 Swift 2 已被弃用。

在 Swift 3 中解析 JSON 时应避免使用 NSDictionaryAnyObject。只需在任何地方使用 [String: Any]

【讨论】:

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

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

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

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

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

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

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