如何在JSON Swift

时间:2018-08-24 13:01:18

标签: 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
}

1 个答案:

答案 0 :(得分:0)

您可以创建一个函数,该函数将删除外部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)
}
相关问题