Как получить значение в json Swift - PullRequest
0 голосов
/ 24 августа 2018

У меня есть файл 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()

}

Структуры для Decodable элементов. Но я не знаю, как я могу обрезать этот первый элемент ("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 голосов
/ 24 августа 2018

Вы можете создать функцию, которая будет удалять внешний объект 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
    }
}

Затем вы можете использовать это в закрытии URL-сессии следующим образом:

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)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...