-1

I'm having issues trying to access a string inside of a JSON dictionary, Here is the JSON data, the string I'm trying to access is the "link" value :

channels =     (
  {
    social =             {
      facebook =                 {
        "facebook_id" = 47360808996;
        link = "https://www.facebook.com/CBS";
      };
      twitter =                 {
        link = "https://twitter.com/CBS";
        "twitter_id" = 97739866;
      };
    };
  }
);

Here is the custom objects I created which keeps giving me an error

" Type '(key: String, value: AnyObject)' has no subscript members"

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"]
  }
}

Here is my JSON call function to get info:

  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)

    }
  }
}

For reference I recreated this from a working project using NSURLSession the below code works:

  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"
SwiftyJD
  • 5,257
  • 7
  • 41
  • 92

1 Answers1

0

I will assume you use Swift 3, as Swift 2 is deprecated.

You should avoid NSDictionary and AnyObject when parsing JSON in Swift 3. Simply use [String: Any] everywhere instead.

Cœur
  • 37,241
  • 25
  • 195
  • 267