使用 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.valuevalue 和有什么区别?看起来您正在从参数中获取值。【参考方案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 设置结构

发布方法 HTTPHeader 中的 Alamofire 5.1 更新问题,使用 alamofire 的网络调用

在 Alamofire 函数调用中更改属性值

使用 Alamofire 进行 GET 请求调用后没有响应

Swift 中的 Alamofire .post。 “调用结果未使用,但产生‘DataRequest’