2016-12-12 3 views
0

Это ObjectMapper я использую:Как получить доступ к ссылке, встроенной в словарь JSON, используя AlamoFire/ObjectMapper?

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()) 

    } 
} 

Initialy Я имел " facebookLink "под классом" Facebook "в качестве строки, но он сохранил нулевой уровень. Затем я попробовал 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 
     } 

    } 
} 

ответ

0

Попробуйте установить ссылка в виде строки

var stringURL:String? 

Getting ссылку

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

То же самое для социальных, сначала создать map из социальных dictionary.

+0

Хорошо, я вижу, как это сработает, но по какой-то странной причине он продолжает возвращать нуль. – SwiftyJD

+0

Что возвращает ниль, строка или URL-адрес? –

+0

Когда я печатаю («Это социальная информация: \ (socialInfo? .channels? .facebookSocial? .facebookLink)»), он возвращает nil – SwiftyJD