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


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-15
    • 2020-04-02
    • 2022-01-24
    • 1970-01-01
    • 2020-07-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多