簡體   English   中英

如何在JSON Swift中獲取價值

[英]How to get value in json Swift

我有一個json文件:

jsonpElixo({  
"response":{  
  "parks":[  
     {  
        "Park":{  
           "id":"2",
           "name":"PARQUE VILLA-LOBOS",
           "type":"Urbano"
        },
        "Address":{  
           "lat":"-23.547245206920508",
           "long":"-46.71627699999999",
           "cep":null,
           "street":"Avenida Professor Fonseca Rodrigues",
           "number":"1025",
           "neighborhood":"Alto Pinheiros",
           "city":"S\u00e3o Paulo",
           "state":"SP",
           "id":"9"
        }
     }
  ]
}
})

但是我無法獲取{}中的元素。 因為“ jsonpElixo(”在可解碼期間中斷。

我該如何解決?


該功能可獲取有關json文件的信息。

func getParks() {
var request = URLRequest(url:gitUrl)
request.addValue("application/json", forHTTPHeaderField: "Content-Type")

URLSession.shared.dataTask(with: request) { (data, response, error) in
        guard let data = data else { return }
        do {
            let decoder = JSONDecoder()
            let welcome = try? decoder.decode(Welcome.self, from: data)

        } catch let err {
            print("Err", err)
        }
        }.resume()

}

可分解元素的結構。 但我不知道該如何為第一個元素(“ jsonpElixo(”)

struct Welcome: Decodable {
let response: Response
}
struct Response: Decodable {
let parks: [Park]
}
struct Park: Decodable {
let park: ParkClass
let address: Address
enum CodingKeys: String, CodingKey {
    case park = "Park"
    case address = "Address"
}
}

struct Address: Decodable {
let lat, long: String
let cep: String?
let street, number, neighborhood, city: String
let state, id: String
}

struct ParkClass: Decodable {
 let id, name, type: String
}

您可以創建一個函數,該函數將刪除外部jsonpElixo()對象並返回要使用的json。

從Data擴展開始,我們可以創建類似於以下內容的內容:

extension Data {
    func decodeJsonpElixo() -> Data {
        guard let jsonpString = String(data: self, encoding: .utf8) else {return self}

        if jsonpString.hasPrefix("jsonpElixo(") && jsonpString.hasSuffix(")") {
            var decoderString = jsonpString.replacingOccurrences(of: "jsonpElixo(", with: "")
            decoderString.remove(at: String.Index(encodedOffset: decoderString.endIndex.encodedOffset - 1))

            return Data(decoderString.utf8)
        }

        return self
    }
}

然后,您可以像下面這樣在URLSession閉包中使用它:

guard let data = data else { return }
let decoderData = data.decodeJsonpElixo()
let decoder = JSONDecoder()
do {
    let welcome = try decoder.decode(Welcome.self, from: decoderData)
} catch let err {
    print(err)
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM