>

URL을 사용하여 Flickr의 공개 피드에서 JSON을 사용하고 싶습니다

https://api.flickr.com/services /feeds/photos_public.gne?nojsoncallback=1&format=json

Alamofire를 사용하여 JSON을 사용한 다음 ObjectMapper를 사용하여 JSON을 기본 사진 데이터 모델에 매핑하려고합니다.

내가 가진 문제는 JSON을 구문 분석 한 다음 매핑 할 수 없다는 것입니다.

objects = Mapper<Photo>().mapArray(JSONArray: json)!

반환 :

Cannot convert value of type 'JSON' to expected argument type '[[String : Any]]'

내 코드는 다음과 같습니다;

FlickrAPI.executeRequestURL(url, parameters: parameters) { (success, error, response) in
            if (success) {
                //print ("Response: \(response)")
                if let jsonObject = response?.result.value {
                    let json = JSON(jsonObject)
                    objects = Mapper<Photo>().mapArray(JSONArray: json)!
                }
            }
            else {
                print ("** Error -- \(error?.localizedDescription) **")
                taskCallback(false, error)
            }
        }
// Execute URL request code:
 static func executeRequestURL(_ requestURL: URL, parameters:[String: String], taskCallback: @escaping (Bool, Error?, DataResponse<Any>?) -> ())
    {
        print ("Attempting URL -- \(requestURL)")
        Alamofire.request(requestURL, parameters:["nojsoncallback": "1", "format": "json"])
            .validate(statusCode: 200..<300)
            .validate(contentType: ["application/json"])
            .responseJSON { response in
                switch(response.result) {
                case .success(_):
                    taskCallback(true, nil, response)
                    break
                case .failure(_):
                    print("Error while fetching url: \(response.result.error)")
                    taskCallback(false, response.result.error, nil)
                    break
                }
        }
    }
// Photo model
final class Photo: Object, Mappable {
    private(set) dynamic var uuid: String = UUID().uuidString
    dynamic var name: String = ""
    dynamic var author_id: String = ""
    dynamic var title: String = ""
override public static func primaryKey() -> String? {
        return "uuid"
    }
    required convenience public init?(map: Map) {
        self.init()
    }
    // MARK: - ObjectMapper protocol methods
    public func mapping(map: Map) {
        self.name <- map["name"]
        self.author_id <- map["author_id"]
        self.title <- map["title"]
    }

사진 공개 URL을 검토 할 때 응답에 사진 객체가 "items": 라는 배열로 함께 정렬되어 있음을 알 수 있습니다.

AlamofireObjectMapper 를 사용할 수 있다는 것을 읽었습니다.  돕기 위해;그러나 실제로 사용하는 방법에 대해 혼란스러워합니다.

어쨌든 내 쿼리는 구체적으로 items 를 어떻게 소비합니까?  ObjectMapper를 사용하여 Flickr 퍼블릭 사진 피드 내의 배열?

많은 감사합니다

  • 답변 # 1

    AlamofireObjectMapper를 사용하여이 문제를 해결할 수있었습니다

    먼저, 응답을 다시받을 클래스를 만듭니다. 둘째,이 클래스가 매핑을 준수하는지 확인하십시오;

    // Required to help integrate Alamofire with Objectmapper (via AlamofireObjectMapper)
    final class PhotoResponse: Mappable {
        var items: [Photo]?
        required init?(map: Map){
        }
        func mapping(map: Map) {
            items <- map["items"]
        }
    }
    
    

    그런 다음 실행 URL을 호출 할 때이 클래스에 맞게 약간 변경합니다.

    static func executeRequestURL(_ requestURL: URL, parameters:[String: String], taskCallback: @escaping (Bool, Error?, DataResponse<PhotoResponse>?) -> ())
        {
            print ("Attempting URL -- \(requestURL)\n")
            Alamofire.request(requestURL, parameters:["nojsoncallback": "1", "format": "json"])
                .validate(statusCode: 200..<300)
                .validate(contentType: ["application/json"])
                .responseObject { (response: DataResponse<PhotoResponse>) in
                    switch(response.result) {
                    case .success(_):
                        taskCallback(true, nil, response)
                        break
                    case .failure(_):
                        print("** Error while fetching url: \(response.result.error) **")
                        taskCallback(false, response.result.error, nil)
                        break
                    }
            }
        }
    
    

    여기 중요한 부분은 response: DataResponse<PhotoResponse>) in 입니다  줄.

    마침내 fetchPublicPhotos 를 통해 호출 할 때  함수 결과를 다시 조회 할 수 있습니다

    let photoResponse = response?.result.value
    if let items = photoResponse?.items {
        print ("Items found: #\(items.count)")
       // do something with items here
    }
    
    

  • 이전 java - 유창한 인터페이스 대 빌더 패턴 - 장점 및 단점
  • 다음 ruby - A 다음에 시작하여 Z 뒤에 완료되는 다양한 문자 배열을 만듭니다 (B에서 AC로)