Cách đơn giản và rõ ràng để chuyển đổi chuỗi JSON thành Đối tượng trong Swift


82

Tôi đã tìm kiếm trong nhiều ngày để chuyển đổi một chuỗi JSON khá đơn giản thành một loại đối tượng trong Swift nhưng không có kết quả.

Đây là mã cho cuộc gọi dịch vụ web:

func GetAllBusiness() {

        Alamofire.request(.GET, "http://MyWebService/").responseString { (request, response, string, error) in

                println(string)

        }
}

Tôi có một cấu trúc nhanh chóng Business.swift:

struct Business {
    var Id : Int = 0
    var Name = ""
    var Latitude = ""
    var Longitude = ""
    var Address = ""
}

Đây là dịch vụ thử nghiệm của tôi được triển khai:

[
  {
    "Id": 1,
    "Name": "A",
    "Latitude": "-35.243256",
    "Longitude": "149.110701",
    "Address": null
  },
  {
    "Id": 2,
    "Name": "B",
    "Latitude": "-35.240592",
    "Longitude": "149.104843",
    "Address": null
  }
  ...
]

Sẽ rất vui nếu ai đó hướng dẫn tôi làm điều này.

Cảm ơn.

Câu trả lời:


56

Dưới đây là một số mẹo làm thế nào để bắt đầu với ví dụ đơn giản.

Hãy xem xét bạn có Chuỗi mảng JSON sau (tương tự như của bạn) như:

 var list:Array<Business> = []

  // left only 2 fields for demo
  struct Business {
    var id : Int = 0
    var name = ""               
 }

 var jsonStringAsArray = "[\n" +
        "{\n" +
        "\"id\":72,\n" +
        "\"name\":\"Batata Cremosa\",\n" +            
        "},\n" +
        "{\n" +
        "\"id\":183,\n" +
        "\"name\":\"Caldeirada de Peixes\",\n" +            
        "},\n" +
        "{\n" +
        "\"id\":76,\n" +
        "\"name\":\"Batata com Cebola e Ervas\",\n" +            
        "},\n" +
        "{\n" +
        "\"id\":56,\n" +
        "\"name\":\"Arroz de forma\",\n" +            
    "}]"


        // convert String to NSData
        var data: NSData = jsonStringAsArray.dataUsingEncoding(NSUTF8StringEncoding)!
        var error: NSError?

        // convert NSData to 'AnyObject'
        let anyObj: AnyObject? = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions(0),
            error: &error)
        println("Error: \(error)")

     // convert 'AnyObject' to Array<Business>
     list = self.parseJson(anyObj!)

     //===============

    func parseJson(anyObj:AnyObject) -> Array<Business>{

        var list:Array<Business> = []

         if  anyObj is Array<AnyObject> {

            var b:Business = Business()

            for json in anyObj as Array<AnyObject>{
             b.name = (json["name"] as AnyObject? as? String) ?? "" // to get rid of null
             b.id  =  (json["id"]  as AnyObject? as? Int) ?? 0                 

               list.append(b)
            }// for

        } // if

      return list

    }//func    

[BIÊN TẬP]

Để thoát khỏi null đã thay đổi thành:

b.name = (json["name"] as AnyObject? as? String) ?? ""
b.id  =  (json["id"]  as AnyObject? as? Int) ?? 0 

Xem thêm Tham khảo của Coalescing Operator(aka ??)

Hy vọng nó sẽ giúp bạn sắp xếp mọi thứ,


Tuyệt vời! Làm việc như người ở. Cảm ơn! Chỉ một điều nhỏ, đó là lỗi nếu phần tử trong JSON là null. Giống như trong: b.name = json ["name"] dưới dạng AnyObject! as String Nếu tên là null, làm cách nào tôi có thể thêm điều kiện để làm cho nó có giá trị rỗng?
Hasan Nizamani

điều gì là cần thiết để truyền tới AnyObject trước khi truyền tới Chuỗi?
Bateramos

@Bateramos không có gì. Bạn nhận được tùy chọn AnyObjecttheo khóa, chỉ cần chắc chắn trước khi dự báo xuống Chuỗi mà không phải nil. Vì lý do đó tôi có thể để incapsualte bằng cách sử dụng !hoặc trong trường hợp của tôi ?với holdplace??
Maxim Shoustin

Tôi đoán, Nếu bạn tạo đối tượng var b:Business = Business()ngoài vòng lặp, thì nó có thể hiển thị cùng một dữ liệu trong mỗi phần tử danh sách.
Patriks vào

50

cho 3/4 nhanh chóng

extension String {
    func toJSON() -> Any? {
        guard let data = self.data(using: .utf8, allowLossyConversion: false) else { return nil }
        return try? JSONSerialization.jsonObject(with: data, options: .mutableContainers)
    }
}

Cách sử dụng ví dụ:

 let dict = myString.toJSON() as? [String:AnyObject] // can be any type here

2
Chú thích cuối trang trong tương lai: thay vì do-catch, try?có thể được sử dụng ở đây, sẽ cho kết quả tương tự như trả về nil in catch.
Okhan Okbay

... và cách một người truy cập chính xác một tham số sau khi chuyển đổi này như thế nào?
Starwave,

Đối với bất kỳ ai khác quan tâm: hãy để jsonObjectAsNSDictionary = responseString? .ToJSON () as! [Chuỗi: AnyObject] print (jsonObjectAsNSDictionary ["permissions"]! ["Canaddeditowncomment"])
Starwave,

1
Vui lòng sửa cú pháp nhanh ... extension String { func toJSON() -> Any? { guard let data = self.data(using: .utf8, allowLossyConversion: false) else { return nil } return try? JSONSerialization.jsonObject(with: data, options: .mutableContainers) } }
Yasir Ali

27

Vì phần mở rộng chuỗi đơn giản nên đủ:

extension String {

    var parseJSONString: AnyObject? {

        let data = self.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)

        if let jsonData = data {
            // Will return an object or nil if JSON decoding fails
            return NSJSONSerialization.JSONObjectWithData(jsonData, options: NSJSONReadingOptions.MutableContainers, error: nil)
        } else {
            // Lossless conversion of the string was not possible
            return nil
        }
    }
}

Sau đó:

var jsonString = "[\n" +
    "{\n" +
    "\"id\":72,\n" +
    "\"name\":\"Batata Cremosa\",\n" +            
    "},\n" +
    "{\n" +
    "\"id\":183,\n" +
    "\"name\":\"Caldeirada de Peixes\",\n" +            
    "},\n" +
    "{\n" +
    "\"id\":76,\n" +
    "\"name\":\"Batata com Cebola e Ervas\",\n" +            
    "},\n" +
    "{\n" +
    "\"id\":56,\n" +
    "\"name\":\"Arroz de forma\",\n" +            
"}]"

let json: AnyObject? = jsonString.parseJSONString
println("Parsed JSON: \(json!)")
println("json[3]: \(json![3])")

/* Output:

Parsed JSON: (
    {
    id = 72;
    name = "Batata Cremosa";
    },
    {
    id = 183;
    name = "Caldeirada de Peixes";
    },
    {
    id = 76;
    name = "Batata com Cebola e Ervas";
    },
    {
    id = 56;
    name = "Arroz de forma";
    }
)

json[3]: {
    id = 56;
    name = "Arroz de forma";
}
*/

15

Swift 4 phân tích cú pháp JSON thanh lịch hơn nhiều. Chỉ cần áp dụng giao thức codable cho cấu trúc của bạn theo ví dụ đơn giản này:

struct Business: Codable {
    let id: Int
    let name: String
}

Để phân tích cú pháp mảng JSON, bạn cho bộ giải mã biết các đối tượng của mảng dữ liệu là gì

let parsedData = decoder.decode([Business].self, from: data)

Đây là một ví dụ hoạt động đầy đủ:

import Foundation

struct Business: Codable {
    let id: Int
    let name: String
}

// Generating the example JSON data: 
let originalObjects = [Business(id: 0, name: "A"), Business(id: 1, name: "B")]
let encoder = JSONEncoder()
let data = try! encoder.encode(originalObjects)

// Parsing the data: 
let decoder = JSONDecoder()
let parsedData = try! decoder.decode([Business].self, from: data)

Để biết thêm thông tin cơ bản, hãy xem hướng dẫn tuyệt vời này .


Nhược điểm của điều này là người ta phải theo dõi cấu trúc, và nếu bạn có ~ 30 tham số trở lên, việc quản lý sẽ trở nên phức tạp.
Starwave,

@Starwave: Không chắc chắn điều này giải quyết mối quan tâm của bạn, nhưng lưu ý rằng bạn chỉ cần đưa các trường bạn quan tâm vào cấu trúc bạn sử dụng để giải mã dữ liệu. Ví dụ: nếu JSON có dạng [{"id": 1, "name:" A "," location ":" Warsaw "},] thì bạn vẫn có thể giải mã nó bằng cách sử dụng cùng một cấu trúc Business. Trường vị trí sẽ đơn giản là bị bỏ qua.
Noyer282 Ngày

Chết tiệt, tôi không nghĩ đến điều đó ... Nhưng sau đó, dữ liệu phân tích cú pháp ở đây là gì? NSDictionary?
Starwave

@Starwave: Đó là một mảng cấu trúc, giống như trong câu hỏi ban đầu.
Noyer282,

9

Đối với Swift 4

Tôi đã sử dụng logic của @ Passkit nhưng tôi phải cập nhật theo Swift 4


Bước.1 Đã tạo phần mở rộng cho Lớp chuỗi

import UIKit


extension String
    {
        var parseJSONString: AnyObject?
        {
            let data = self.data(using: String.Encoding.utf8, allowLossyConversion: false)

            if let jsonData = data
            {
                // Will return an object or nil if JSON decoding fails
                do
                {
                    let message = try JSONSerialization.jsonObject(with: jsonData, options:.mutableContainers)
                    if let jsonResult = message as? NSMutableArray
                    {
                        print(jsonResult)

                        return jsonResult //Will return the json array output
                    }
                    else
                    {
                        return nil
                    }
                }
                catch let error as NSError
                {
                    print("An error occurred: \(error)")
                    return nil
                }
            }
            else
            {
                // Lossless conversion of the string was not possible
                return nil
            }
        }
    }

Step.2 Đây là cách tôi đã sử dụng trong điều khiển điểm của tôi

var jsonString = "[\n" +
    "{\n" +
    "\"id\":72,\n" +
    "\"name\":\"Batata Cremosa\",\n" +            
    "},\n" +
    "{\n" +
    "\"id\":183,\n" +
    "\"name\":\"Caldeirada de Peixes\",\n" +            
    "},\n" +
    "{\n" +
    "\"id\":76,\n" +
    "\"name\":\"Batata com Cebola e Ervas\",\n" +            
    "},\n" +
    "{\n" +
    "\"id\":56,\n" +
    "\"name\":\"Arroz de forma\",\n" +            
"}]"

 //Convert jsonString to jsonArray

let json: AnyObject? = jsonString.parseJSONString
print("Parsed JSON: \(json!)")
print("json[2]: \(json![2])")

Tất cả tín dụng được chuyển cho người dùng ban đầu, tôi vừa cập nhật cho phiên bản nhanh nhất


7

Tôi đã viết một thư viện giúp làm việc với dữ liệu json và giải mã hóa dễ dàng trong Swift. Bạn có thể lấy nó tại đây: https://github.com/isair/JSONHelper

Chỉnh sửa: Tôi đã cập nhật thư viện của mình, bây giờ bạn có thể làm điều đó chỉ với điều này:

class Business: Deserializable {
    var id: Int?
    var name = "N/A"  // This one has a default value.

    required init(data: [String: AnyObject]) {
        id <-- data["id"]
        name <-- data["name"]
    }
}

var businesses: [Business]()

Alamofire.request(.GET, "http://MyWebService/").responseString { (request, response, string, error) in
    businesses <-- string
}

Câu trả lời cũ:

Đầu tiên, thay vì sử dụng .responseString, hãy sử dụng .response để nhận đối tượng phản hồi. Sau đó, thay đổi mã của bạn thành:

func getAllBusinesses() {

    Alamofire.request(.GET, "http://MyWebService/").response { (request, response, data, error) in
        var businesses: [Business]?

        businesses <-- data

        if businesses == nil {
            // Data was not structured as expected and deserialization failed, do something.
        } else {
            // Do something with your businesses array. 
        }
    }
}

Và bạn cần tạo một Hạng thương gia như sau:

class Business: Deserializable {
    var id: Int?
    var name = "N/A"  // This one has a default value.

    required init(data: [String: AnyObject]) {
        id <-- data["id"]
        name <-- data["name"]
    }
}

Bạn có thể tìm thấy tài liệu đầy đủ trên repo GitHub của tôi. Chúc vui vẻ!


Cảm ơn! Nhưng tôi đang tìm kiếm một cách tùy chỉnh hơn để thực hiện vì đây là một dự án đại học mà tôi đang thực hiện và người giám sát của tôi sẽ không vui lắm nếu anh ta thấy tôi đang sử dụng một API.
Hasan Nizamani

Sẽ sử dụng thư viện của bạn cho các dự án riêng tư của tôi. Cảm ơn!!
Hasan Nizamani

Rất vui vì tôi đã có thể giúp đỡ bằng cách này hay cách khác. Chúc may mắn cho các dự án của bạn! ^^
isair

6

Đối với Swift 4 , tôi đã viết tiện ích mở rộng này bằng giao thức Codable :

struct Business: Codable {
    var id: Int
    var name: String
}

extension String {

    func parse<D>(to type: D.Type) -> D? where D: Decodable {

        let data: Data = self.data(using: .utf8)!

        let decoder = JSONDecoder()

        do {
            let _object = try decoder.decode(type, from: data)
            return _object

        } catch {
            return nil
        }
    }
}

var jsonString = "[\n" +
    "{\n" +
    "\"id\":72,\n" +
    "\"name\":\"Batata Cremosa\",\n" +
    "},\n" +
    "{\n" +
    "\"id\":183,\n" +
    "\"name\":\"Caldeirada de Peixes\",\n" +
    "},\n" +
    "{\n" +
    "\"id\":76,\n" +
    "\"name\":\"Batata com Cebola e Ervas\",\n" +
    "},\n" +
    "{\n" +
    "\"id\":56,\n" +
    "\"name\":\"Arroz de forma\",\n" +
"}]"

let businesses = jsonString.parse(to: [Business].self)

4

Đối với iOS 10& Swift 3, sử dụng Alamofire & Gloss :

Alamofire.request("http://localhost:8080/category/en").responseJSON { response in

if let data = response.data {

    if let categories = [Category].from(data: response.data) {

        self.categories = categories

        self.categoryCollectionView.reloadData()
    } else {

        print("Casting error")
    }
  } else {

    print("Data is null")
  }
}

và đây là lớp Category

import Gloss

struct Category: Decodable {

    let categoryId: Int?
    let name: String?
    let image: String?

    init?(json: JSON) {
        self.categoryId = "categoryId" <~~ json
        self.name = "name" <~~ json
        self.image = "image" <~~ json
    }
}

IMO, đây là giải pháp thanh lịch nhất.


2
let jsonString = "{\"id\":123,\"Name\":\"Munish\"}"

Chuyển đổi chuỗi thành NSData

 var data: NSData =jsonString.dataUsingEncoding(NSUTF8StringEncoding)!

 var error: NSError?

Chuyển đổi NSData thành AnyObject

var jsonObject: AnyObject? = NSJSONSerialization.JSONObjectWithData(data,     options: NSJSONReadingOptions.allZeros, error: &error)

println("Error: \\(error)")

let id = (jsonObject as! NSDictionary)["id"] as! Int

let name = (jsonObject as! NSDictionary)["name"] as! String

println("Id: \\(id)")

println("Name: \\(name)")

2

Tôi thích phản hồi của RDC, nhưng tại sao lại giới hạn JSON trả về chỉ có các mảng ở cấp cao nhất? Tôi cần cho phép một từ điển ở cấp cao nhất, vì vậy tôi đã sửa đổi nó như vậy:

extension String
{
    var parseJSONString: AnyObject?
    {
        let data = self.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)

        if let jsonData = data
        {
            // Will return an object or nil if JSON decoding fails
            do
            {
                let message = try NSJSONSerialization.JSONObjectWithData(jsonData, options:.MutableContainers)
                if let jsonResult = message as? NSMutableArray {
                    return jsonResult //Will return the json array output
                } else if let jsonResult = message as? NSMutableDictionary {
                    return jsonResult //Will return the json dictionary output
                } else {
                    return nil
                }
            }
            catch let error as NSError
            {
                print("An error occurred: \(error)")
                return nil
            }
        }
        else
        {
            // Lossless conversion of the string was not possible
            return nil
        }
    }

2

SWIFT4 - Cách dễ dàng và thanh lịch để giải mã chuỗi JSON thành Struct.

Bước đầu tiên - mã hóa chuỗi thành dữ liệu bằng mã hóa .utf8.

Hơn giải mã Dữ liệu của bạn thành YourDataStruct.

struct YourDataStruct: Codable {

let type, id: String

init(_ json: String, using encoding: String.Encoding = .utf8) throws {
    guard let data = json.data(using: encoding) else {
        throw NSError(domain: "JSONDecoding", code: 0, userInfo: nil)
    }
    try self.init(data: data)
}

init(data: Data) throws {
    self = try JSONDecoder().decode(YourDataStruct.self, from: data)
}                                                                      
}

do { let successResponse = try WSDeleteDialogsResponse(response) }
} catch {}

1

Bạn có thể sử dụng swift.quicktype.io để chuyển đổi JSONsang một trong hai structhoặc class. Thậm chí bạn có thể đề cập đến phiên bản của mã swift to genrate.

JSON mẫu:

{
  "message": "Hello, World!"
}

Mã đã tạo:

import Foundation

typealias Sample = OtherSample

struct OtherSample: Codable {
    let message: String
}

// Serialization extensions

extension OtherSample {
    static func from(json: String, using encoding: String.Encoding = .utf8) -> OtherSample? {
        guard let data = json.data(using: encoding) else { return nil }
        return OtherSample.from(data: data)
    }

    static func from(data: Data) -> OtherSample? {
        let decoder = JSONDecoder()
        return try? decoder.decode(OtherSample.self, from: data)
    }

    var jsonData: Data? {
        let encoder = JSONEncoder()
        return try? encoder.encode(self)
    }

    var jsonString: String? {
        guard let data = self.jsonData else { return nil }
        return String(data: data, encoding: .utf8)
    }
}

extension OtherSample {
    enum CodingKeys: String, CodingKey {
        case message
    }
}

1

Sử dụng thư viện SwiftyJSON , bạn có thể làm cho nó giống như

if let path : String = Bundle.main.path(forResource: "tiles", ofType: "json") {
    if let data = NSData(contentsOfFile: path) {
        let optData = try? JSON(data: data as Data)
        guard let json = optData else {
            return
        }
        for (_, object) in json {
            let name = object["name"].stringValue
            print(name)
        }
    }
} 

0

Đây là một mẫu để bạn làm cho mọi thứ đơn giản và dễ dàng hơn. Dữ liệu Chuỗi của tôi trong cơ sở dữ liệu của tôi là một tệp JSON trông giống như sau:

[{"stype":"noun","sdsc":"careless disregard for consequences","swds":"disregard, freedom, impulse, licentiousness, recklessness, spontaneity, thoughtlessness, uninhibitedness, unrestraint, wantonness, wildness","anwds":"restraint, self-restraint"},{"stype":"verb","sdsc":"leave behind, relinquish","swds":"abdicate, back out, bail out, bow out, chicken out, cop out, cut loose, desert, discard, discontinue, ditch, drop, drop out, duck, dump, dust, flake out, fly the coop, give up the ship, kiss goodbye, leave, leg it, let go, opt out, pull out, quit, run out on, screw, ship out, stop, storm out, surrender, take a powder, take a walk, throw over, vacate, walk out on, wash hands of, withdraw, yield","anwds":"adopt, advance, allow, assert, begin, cherish, come, continue, defend, favor, go, hold, keep, maintain, persevere, pursue, remain, retain, start, stay, support, uphold"},{"stype":"verb","sdsc":"leave in troubled state","swds":"back out, desert, disown, forsake, jilt, leave, leave behind, quit, reject, renounce, throw over, walk out on","anwds":"adopt, allow, approve, assert, cherish, come, continue, defend, favor, keep, pursue, retain, stay, support, uphold"}]

Để tải dữ liệu chuỗi JSON này, hãy làm theo các Bước đơn giản sau. Đầu tiên, tạo một lớp cho Đối tượng MoreData của tôi như thế này:

class  MoreData {
public private(set) var stype : String
public private(set) var sdsc : String
public private(set) var swds : String
public private(set) var anwds : String

init( stype : String, sdsc : String, swds : String, anwds : String) {

    self.stype = stype
    self.sdsc = sdsc
    self.swds = swds
    self.anwds = anwds
}}

Thứ hai, tạo tiện ích mở rộng Chuỗi của tôi cho Chuỗi JSON của tôi như sau:

extension  String {
func toJSON() -> Any? {
    guard let data = self.data(using: .utf8, allowLossyConversion: false) else { return nil }
    return try? JSONSerialization.jsonObject(with: data, options: .mutableContainers)
}}

Thứ ba, tạo Lớp thiết bị của tôi để xử lý Dữ liệu chuỗi của tôi như sau:

class Services {
static let instance: Services = Services()

func loadMoreDataByString(byString: String) -> [MoreData]{
    var  myVariable = [MoreData]()

    guard let ListOf = byString.toJSON() as? [[String: AnyObject]] else { return  [] }

    for object in ListOf {
        let stype  = object["stype"] as? String ?? ""
        let sdsc  = object["sdsc"] as? String ?? ""
         let swds  = object["swds"] as? String ?? ""
        let anwds  = object["anwds"] as? String ?? ""

        let myMoreData = MoreData(stype : stype, sdsc : sdsc, swds : swds, anwds : anwds)
        myVariable.append(myMoreData)
    }
    return myVariable
}}

Cuối cùng, gọi Hàm này từ Bộ điều khiển Chế độ xem để tải dữ liệu trong chế độ xem bảng như sau:

    func handlingJsonStringData(){
    moreData.removeAll(keepingCapacity: false)
    moreData =  Services.instance.loadMoreDataByString(byString: jsonString)
    print(self.moreData.count)
    tableView.reloadData()
}

0

Nó có thể giúp ai đó. Ví dụ tương tự.

Đây là Codablelớp của chúng tôi để liên kết dữ liệu. Bạn có thể dễ dàng tạo lớp này bằng SwiftyJsonAccelerator

 class ModelPushNotificationFilesFile: Codable {

  enum CodingKeys: String, CodingKey {
    case url
    case id
    case fileExtension = "file_extension"
    case name
  }

  var url: String?
  var id: Int?
  var fileExtension: String?
  var name: String?

  init (url: String?, id: Int?, fileExtension: String?, name: String?) {
    self.url = url
    self.id = id
    self.fileExtension = fileExtension
    self.name = name
  }

  required init(from decoder: Decoder) throws {
    let container = try decoder.container(keyedBy: CodingKeys.self)
    url = try container.decodeIfPresent(String.self, forKey: .url)
    id = try container.decodeIfPresent(Int.self, forKey: .id)
    fileExtension = try container.decodeIfPresent(String.self, forKey: .fileExtension)
    name = try container.decodeIfPresent(String.self, forKey: .name)
  }

}

Đây là chuỗi Json

    let jsonString = "[{\"name\":\"\",\"file_extension\":\"\",\"id\":10684,\"url\":\"https:\\/\\/homepages.cae.wisc.edu\\/~ece533\\/images\\/tulips.png\"},

{\"name\":\"\",\"file_extension\":\"\",\"id\":10684,\"url\":\"https:\\/\\/homepages.cae.wisc.edu\\/~ece533\\/images\\/arctichare.png\"},

{\"name\":\"\",\"file_extension\":\"\",\"id\":10684,\"url\":\"https:\\/\\/homepages.cae.wisc.edu\\/~ece533\\/images\\/serrano.png\"},

{\"name\":\"\",\"file_extension\":\"\",\"id\":10684,\"url\":\"https:\\/\\/homepages.cae.wisc.edu\\/~ece533\\/images\\/peppers.png\"},

{\"name\":\"\",\"file_extension\":\"\",\"id\":10684,\"url\":\"https:\\/\\/homepages.cae.wisc.edu\\/~ece533\\/images\\/pool.png\"}]"

Ở đây chúng tôi chuyển đổi thành đối tượng nhanh chóng.

   let jsonData = Data(jsonString.utf8)

        let decoder = JSONDecoder()

        do {
            let fileArray = try decoder.decode([ModelPushNotificationFilesFile].self, from: jsonData)
            print(fileArray)
            print(fileArray[0].url)
        } catch {
            print(error.localizedDescription)
        }
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.