我正在尝试使用(https://collegescorecard.ed.gov/data/documentation/)来填充ios应用程序中的表,但是没有任何数据显示。我已经尝试了很多次api键和url,所以我不这么认为。 json文件的结构
Dev类学校
名称字符串 IPEDS中报告的机构名称(INSTNM)。
import UIKit
import Alamofire
class ViewController: UIViewController {
let URLStr = "https://api.data.gov/ed/collegescorecard/v1/schools?fields=school.name"
var resultArray = [Users]()
@IBOutlet weak var tableView: UITableView!
@IBOutlet weak var searchBar: UISearchBar!
var searchCollege = [String]()
override func viewDidLoad() {
super.viewDidLoad()
tableView.dataSource = self
tableView.delegate = self
callAPI()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
func callAPI() {
let key = "key redacted"
//let url = URL(string:"\(URLStr)?api_key=\(key)")
let url = URL(string:"\(URLStr)&api_key=\(key)")
print(url)
Alamofire.request(url!, method: .get, parameters: nil, headers:[:]).responseJSON {(response) in
if let responseObj = response.value as? [[String: Any]]{
self.resultArray = self.parseJSON(userData: responseObj)
print("response here", response)
self.tableView.reloadData()
}
}
}
func parseJSON(userData: [[String:Any]])-> [Users] {
var userArr = [Users]()
for obj in userData {
do { let data = try JSONSerialization.data(withJSONObject: obj, options: .prettyPrinted)
let decodedData = try JSONDecoder().decode(Users.self, from: data)
userArr.append(decodedData)
}
catch {
}
}
return userArr
}
}
userModal.swift
mport Foundation
struct Users: Codable {
let userSchool_name: String?
}
enum CodingKeys: String, CodingKey {
case userSchool_name = "school.name"
}
我试图打印出响应和不同的对象,但是什么也没打印出来。我下面有一个函数可以在应用程序中显示它,但我认为这不是问题。
json输出
SUCCESS: {
metadata = {
page = 0;
"per_page" = 20;
total = 7112;
};
results = (
{
"school.name" = "West Michigan College of Barbering and Beauty";
},
{
"school.name" = "Georgia College & State University";
},
{
"school.name" = "Georgia Southern University";
},
{
"school.name" = "Clayton State University";
},
{
"school.name" = "Andrew College";
},
{
"school.name" = "Columbus Technical College";
},
{
"school.name" = "Georgia Northwestern Technical College";
},
{
"school.name" = "Atlanta Metropolitan State College";
},
{
"school.name" = "Clark Atlanta University";
},
{
"school.name" = "Augustana College";
},
{
"school.name" = "Miami Ad School at Portfolio Center";
},
{
"school.name" = "Tricoci University of Beauty Culture-Urbana";
},
{
"school.name" = "University of Hawaii at Manoa";
},
{
"school.name" = "Aveda Institute-Twin Falls";
},
{
"school.name" = "Cameo Beauty Academy";
},
{
"school.name" = "Truett McConnell University";
},
{
"school.name" = "Cannella School of Hair Design-Chicago";
},
{
"school.name" = "Valdosta State University";
},
{
"school.name" = "American Academy of Art";
},
{
"school.name" = "City Colleges of Chicago-Kennedy-King College";
}
);
}
答案 0 :(得分:0)
首先删除parseJSON
,将JSON转换为数组,然后再转换回JSON,然后再转换为带有JSONDecoder
的结构是没有意义的
func parseJSON(userData: [[String:Any]])-> [Users] {
var userArr = [Users]()
for obj in userData {
do { let data = try JSONSerialization.data(withJSONObject: obj, options: .prettyPrinted)
let decodedData = try JSONDecoder().decode(Users.self, from: data)
userArr.append(decodedData)
}
catch {
}
}
return userArr
}
}
然后您必须为根对象添加一个结构
struct Root: Codable {
let results : [Users]
}
struct Users: Codable {
let userSchool_name: String?
private enum CodingKeys: String, CodingKey {
case userSchool_name = "school.name"
}
}
并用
替换Alamofire零件 Alamofire.request(url!).responseData { response in
switch response.result {
case .success(let data):
do {
self.resultArray = try JSONDecoder().decode(Root.self, from: data).results
self.tableView.reloadData()
} catch {
print(error)
}
case .failure(let error):
print(error)
}
}
它接收Data
而不是解码的数组并处理所有错误。