Как искать JSON API и декодировать массив с помощью AlamoFire - PullRequest
0 голосов
/ 11 мая 2018

Я ищу JSON API и мне нужно декодировать массив внутри него.Я использую AlamoFire.Пример: когда я набираю букву «F», я хочу, чтобы отображалось только слово «F».Я хотел бы искать только в массиве «имя».Любая помощь по этому вопросу будет принята с благодарностью!

Это мой код ниже:

func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
    let url = "http://dummy.com/url"
    Alamofire.request(url).responseData { (dataResponse) in
        if let err = dataResponse.error {
            print("Failed to contact", err)
            return
        }

        guard let data = dataResponse.data else { return }
        let dummyString = String(data: data, encoding: .utf8)
        print(dummyString ?? "")

        do {
             let searchResult = try JSONDecoder().decode(SearchResults.self, from: data)
            print("Result Count:", searchResult.id)

        } catch let decodeError {
            print("Failed to decode:", decodeError)
        }
    }
}

struct SearchResults: Decodable {
    let id: String

}

Мой массив API выглядит следующим образом:

{resultId: "1", имя: "Еда",}, {resultId: "2", имя: "Фильмы",}

Ответы [ 2 ]

0 голосов
/ 11 мая 2018

Как вы сказали, ваш ответ:

[
 { resultId: "1", name: "Food" }, 
 { resultId: "2", name: "Movies"}
]

Итак, ваша структура будет

struct SearchResults: Decodable {
    let resultId: String
    let name: String
}

И вы будете использовать ее как:

    do {
        let resultArray = try JSONDecoder().decode([SearchResults].self, from: data)
        print("Result Count:", searchResult.id)

    } catch let decodeError {
        print("Failed to decode:", decodeError)
    }

Для поиска следует использовать filter, например:

    let searchString = "F"
    let filteredArray = resultArray.filter( { String($0.name.first!) == searchString } )

Для сопоставления первого символа = Строка ($ 0.name.first!) == searchText

Проверить, если имя имеет поиск Текст = $ 0.name.contains (searchText)

Всего:

    do {
        let searchResult = try JSONDecoder().decode([SearchResults].self, from: data)
        let filteredArray = resultArray.filter( { $0.name.contains(searchText) } )
    } catch let decodeError {
        print("Failed to decode:", decodeError)
    }
0 голосов
/ 11 мая 2018

Ваш результат в array format, поэтому вам нужно поставить model следующим образом:

let searchResult = try JSONDecoder().decode([SearchResults].self, from: data)

И для поиска вы можете применить фильтры:

let filteredArray = searchResult.filter( { $0.name.contains("f") } )
...