获取JSON的响应并在textField中显示它

时间:2017-05-30 17:37:58

标签: json swift swift3 alamofire

此功能会将照片上传到存储桶,然后在文本字段中显示指向该照片的直接链接。我想做的是缩短链接,所以我使用alamofire创建了一个帖子请求谷歌的URL缩短器,它有效,但我不知道如何显示它文本域。

这是函数

func ImageDownloader(){


    UIApplication.shared.isNetworkActivityIndicatorVisible = true

    let imageContained = viewimage.image

    let storage = Storage.storage()
    var storageRef = storage.reference()
    storageRef = storage.reference(forURL: "") // Link to bucket

    var data = NSData()
    data = UIImageJPEGRepresentation(imageContained!, 0.8)! as NSData
    let dateFormat = DateFormatter()
    dateFormat.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZ"
    let imageName = dateFormat.string(from: NSDate() as Date)
    let imagePath = "images/\(imageName).jpg"
    let metaData = StorageMetadata()
    let mountainsRef = storageRef.child(imagePath).putData(data as Data, metadata: metaData){(metaData,error) in
        if let error = error {
            print(error.localizedDescription)
            return
        }else{
            //store downloadURL
            let downloadURL = metaData!.downloadURL()!.absoluteString
            self.getLink.text = downloadURL



                struct dlink {
                    let longLink: String
                }
                let v = dlink(longLink: "\(downloadURL)")

                let parameters = ["longUrl":"\(v.longLink)","MYURL":""]

                Alamofire.request("https://www.googleapis.com/urlshortener/v1/url?key=MY_KEY", method: .post, parameters: parameters, encoding: JSONEncoding.default).responseJSON { response in
                    print(response)
                }


            }
        metaData?.contentType = "image/jpeg"
        }

这是JSON响应,显示它工作正常。

enter image description here

任何形式的帮助都将不胜感激!

2 个答案:

答案 0 :(得分:1)

您需要访问result.value response来获取序列化JSON响应。

Alamofire.request("https://www.googleapis.com/urlshortener/v1/url?key=MY_KEY", method: .post, parameters: parameters, encoding: JSONEncoding.default).responseJSON { response in
     if let dictionary = response.result.value as? [String:Any] {
         //Now subscript on dictionary with keys to get your values.
         let id = dictionary["id"] as? String ?? "DefaultValue" //set default value that you want
         let kind = dictionary["kind"] as? String ?? "DV"
         let longUrl = dictionary["longUrl"] as? String ?? "DV"
         print(id, kind, longUrl)
     }
}

您可以查看Alamofire个文档的Response Handling部分以获取更多信息。

答案 1 :(得分:0)

您需要使用JSONSerialization来解析数据:

let text = "{\"id\":\"https://link.right.here/\"}"

do {
    let json = try JSONSerialization.jsonObject(with: text.data(using: .ascii)!, options: []) as! [String: Any]
    let id = json["id"] as? String
    print(id)
} catch {
    print("Json parse failure")
    fatalError()
}

(不要忘记全局保存id变量,或者至少在do / catch语句之外保存

然后您需要访问正在更改的文本字段。为此,您应该在故事板中为连接到视图控制器的文本字段创建一个插座。我不会进入这个,因为它不是你的问题所要求的,因为有很多关于它的教程。关键工作是出口。

假设插座的名称为myTextfield,例如,您的代码应如下所示:

self.myTextfield.text = "\(id)"

其中id是在代码的第一部分中设置的变量。