使用SwiftyJSON解析Alamofire的JSON结果

3

我不使用SwiftyJSON来填充表格视图,因为它无法解析Alamofire返回的JSON结果。

let getRouteURL = "http://example.com/api/Trafi/GetRoute/"
    Alamofire.request(getRouteURL, method: HTTPMethod.post, parameters: param, encoding: JSONEncoding.default, headers:nil).responseJSON{ response in

        if let result = response.result.value {
            if let JSON = try? JSON(result){
                if let RoutesArr = JSON["Routes"].arrayObject{
                    self.routes = RoutesArr as! [[String : AnyObject]]
                    self.routeTable.reloadData()
                }
            }

        }

    }

数据示例在此

编辑:这段代码有效,但出错原因是我的网络服务出现错误。谢谢帮助!


在请求时尝试设置内容类型为json。 - Dory
@EricAya 不,只是响应数据不正确。 - Eren Özkul
你是对的 @Dory - Eren Özkul
3个回答

2

在请求JSON时,将内容类型标头设置为application/json,如下所示:

let headers = [
                    "Content-Type" : "application/json; charset=UTF-8"
              ]

let getRouteURL = "http://example.com/api/Trafi/GetRoute/"

Alamofire.request(getRouteURL, 
  method: HTTPMethod.post, 
  parameters: param, 
  encoding: JSONEncoding.default, 
  headers:headers).responseJSON{ response in

    if let result = response.result.value {
        if let JSON = try? JSON(result){
            if let RoutesArr = JSON["Routes"].arrayObject{
                self.routes = RoutesArr as! [[String : AnyObject]]
                self.routeTable.reloadData()
            }
        }

    }

}

1
我只是这样做:
let request = Alamofire.request(url, method: method, parameters: params, encoding: URLEncoding.default, headers: httpHeaders).validate()

request.responseJSON { response in
        switch response.result {
        case .success(let json):
            let jsonObject = JSON(json)
            //Use jsonObject
        ....
        }
    }

如果我没记错的话,这个模式是来自Alamofire的GitHub示例。我会看看能否找到链接。 我认为我对这种模式的使用可能起源于this answer


我必须使用Alamofire。 - Eren Özkul
啊抱歉,可能不太明显,但是这样做可以。我已经编辑过了。 - James Webster

0
这是我在Swift 3上使用SwiftyJSON处理JSON的方式。
// handle data
if let value = response.result.value {
    let json = JSON(value)

    for(_, location): (String, JSON) in json{
        let pendingLocation = PendingLocation(_id: location["_id"].stringValue, userId: location["userID"].stringValue, name: location["name"].stringValue)
        self.pendingLocations.append(pendingLocation)
        self.tableView.reloadData()
    }
}

不起作用,请查看我的示例JSON数据。在这里。 - Eren Özkul
错误域=NSCocoaErrorDomain Code=3840 "JSON文本未以数组或对象开头,且未设置允许片段选项。" UserInfo={NSDebugDescription=JSON文本未以数组或对象开头,且未设置允许片段选项。} - Eren Özkul
@ErenÖzkul,通常在服务没有返回JSON时会出现这个错误。在我遇到的情况中,最常见的原因是没有收到200的HTTP响应。 - James Webster
@JamesWebster 我知道200 HTTP响应,但问题在于“内容类型”。我已经解决了,感谢你的帮助。 - Eren Özkul

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接