使用 Alamofire 调用 JSONArray
Posted
技术标签:
【中文标题】使用 Alamofire 调用 JSONArray【英文标题】:Using Alamofire calling JSONArray 【发布时间】:2016-12-22 05:10:49 【问题描述】:我还是 ios 开发的初学者。我正在为我的项目使用 Swift 3、Alamofire 4 和 SwiftyJson
。我尝试从 JSON 中获取数据。 JSON 在单个数组中返回。这是回报:
JSON:
[
"id": "1",
"post_title": "Event_1",
"post_content": "Taylor Swift",
"start_date": "2016-11-23",
"end_date": "2016-11-23",
"post_date": "2016-11-18"
,
"id": "2",
"post_title": "Event_2",
"post_content": "Nickelback",
"start_date": "2016-11-15",
"end_date": "2016-11-16",
"post_date": "2016-11-15"
,
"id": "3",
"post_title": "Event_3",
"post_content": "Nirvana",
"start_date": "10.00pm on 22-02-2012",
"end_date": "6.00am on 23-02-2012",
"post_date": "2016-07-10"
]
斯威夫特:
var newsArray : [[String:Any]] = []
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
return newsArray.count
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! CustomTableViewCell
let currentNews = newsArray[indexPath.row]
if let post_content = currentNews["post_content"]
cell.lbl_content.text = post_content as? String
return cell
func getJSON()
Alamofire.request(BASE_URL).responseJSON
response in
switch response.result
case .success(let value):
let json = JSON(value)
print(json)
if let tempArray = json as? [[String: Any]]
self.newsArray = tempArray
self.tableView.reloadData()
case .failure(let error):
print(error)
问题:
看起来 tempArray 没有任何值。
我尝试在 tableViewCell 中实现该值。
感谢任何帮助,非常感谢。
【问题讨论】:
打印 tempArray 你会知道数组是否为空 是的,它是空的 【参考方案1】:你可以试试这个代码。
Alamofire.request(BASE_URL).responseJSON
response in
switch response.result
case .success(let value):
//to get JSON return value
if let result = response.result.value
let JSON = result as! [[String: Any]]
//then use guard to get the value your want
case .failure(let error):
print(error)
【讨论】:
为什么它返回 jsonArray 而不是 jsonObject 中的所有值? 还有一件事,你为什么不使用 (let value) ? “为什么它返回 jsonArray 而不是 jsonObject 中的所有值?” - 我也不知道,这取决于你的服务器实现,我读到你的 json 在根级别没有键,所以我确定这是一个 jsonArray。 “还有一件事,你为什么不使用 (let value) ?” - 你的意思是我为什么用guard而不是let?守卫是一个快速的语法,请阅读这个ericcerney.com/swift-guard-statement 正确,json 在根级别没有密钥。response.result.value
和 value
和有什么区别?看起来您正在从参数中获取值。【参考方案2】:
试试这个
if let tempArray = json as? [[String: Any]]
self.newsArray = tempArray
self.tableView.reloadData()
只使用json
,不要使用json[]
【讨论】:
print(json)的值是多少? 与问题中的 JSON 返回相同。【参考方案3】:请在下面试试
if let tempArray = json as? [[String: Any]]
self.newsArray = tempArray.mutableCopy()
self.tableView.reloadData()
【讨论】:
它错误。 [[String:Any]] 类型的值没有成员 'mutableCopy'【参考方案4】:尝试将json[] as? [[String: Any]]
更改为json.array
【讨论】:
It 错误:条件绑定的初始化程序必须具有可选类型,而不是 '[JSON]' 然后将arrayValue
改为array
,仅用于检查nil【参考方案5】:
var newsArray : [[String:Any]] = []
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
return newsArray.count
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! CustomTableViewCell
let currentNews = newsArray[indexPath.row]
if let post_content = currentNews["post_content"]
cell.lbl_content.text = post_content as? String
return cell
func getJSON()
Alamofire.request(BASE_URL).responseJSON
response in
switch response.result
case .success(let value):
let json = JSON(value)
print(json)
if let tempArray = json as? NSArray
self.newsArray = tempArray
print(tempArray)
self.tableView.reloadData()
case .failure(let error):
print(error)
试试上面的代码行。可以帮到你。
【讨论】:
tempArray 上没有值 print(json)的打印日志? 在 print(json) 上有值,但是当涉及到 print(tempArray) 时为空 你能把它贴在这里吗?'NSArray' is not convertible to '[[String:Any]]'
所以我改为self.newsArray = tempArray as! [[String:Any]]
。在那之后,tempArray
仍然没有任何价值。【参考方案6】:
目前我没有使用 Swift 3、Alamofire 4。我在下面的链接中找到了一些解决方案。请检查,如果你能从中得到任何解决方案。 链接:http://ashishkakkad.com/2015/10/how-to-use-alamofire-and-swiftyjson-with-swift/
Alamofire.request("http://api.androidhive.info/contacts/").responseJSON (responseData) -> Void in
if((responseData.result.value) != nil)
let swiftyJsonVar = JSON(responseData.result.value!)
if let resData = swiftyJsonVar["contacts"].arrayObject
self.arrRes = resData as! [[String:AnyObject]]
if self.arrRes.count > 0
self.tblJSON.reloadData()
【讨论】:
如果联系人不存在,我应该放什么? @Sendra 请尝试使用这个:if let resData = swiftyJsonVar.arrayObject以上是关于使用 Alamofire 调用 JSONArray的主要内容,如果未能解决你的问题,请参考以下文章
无法使用改造解析对象内部 jsonarray 的 jsonarray?
Swift4 Json Parse Alamofire 设置结构