Alamofire 无法将结果识别为 JSON

Posted

技术标签:

【中文标题】Alamofire 无法将结果识别为 JSON【英文标题】:Alamofire doesn't recognize result as JSON 【发布时间】:2017-09-13 04:05:02 【问题描述】:

我正在使用 Guzzle 从 php 调用公共 API。它返回有效的 JSON(在 JSONLint.com 上验证)。但是,当我尝试将其返回到我的 ios 应用程序时,Alamofire 不喜欢它。我尝试解码 JSON,然后重新编码,但我得到了相同的结果。我不明白为什么 Alamofire 不接受它。我已经用 Paw 测试了 Web 服务,它返回一个带有 content-typeapplication/json 的 JSON 结果。

我得到的错误是:

由于错误,无法序列化 JSON:无法序列化数据 阅读,因为它的格式不正确。

PHP 代码:

$url = "myUrl";
$client = new GuzzleHttp\Client();

$res = $client->get($url, [
'headers' =>  [
    'Authorization' => "Bearer myKey",
    'Accept' => 'application/json'
    ]
]);

header('Content-type: application/json');
$results = $res->getBody();
$this->response($results, 200);

Swift 代码:

let url = serviceUrl + "currentwar"     
let params = [
    "clanId" : "\(clanId)",
]

Alamofire.request(url, parameters: params, encoding: URLEncoding.default)
    .validate()
    .responseJSON  (response) in
        switch response.result 
        case .success(let data):
            self.json = JSON(data)
            print(self.json as Any)

            // process data

            DispatchQueue.main.async(execute:  () -> Void in
                // populate view
            )

        case .failure(let error):
            print("An error occurred: \(error.localizedDescription)")
        

【问题讨论】:

尝试使用responseString而不是responseJSON并将字符串转换为JSON并解析。 @BadhanGanesh,我试过这个,但似乎无法对结果字符串做任何事情。将其转换为 JSON 只会返回 null。 【参考方案1】:

尝试从 REST 客户端(例如 Postman)检查 API 以验证结果。因为浏览器可以呈现 html 内容,您可能无法在浏览器窗口中看到它,但您可以轻松地从页面源视图中检查出来。 我总是在 Postman 中检查 API,因为它可以确保 API 中没有来自服务器端的错误,并且 API 使用者可以轻松使用该 API。

【讨论】:

正如我在帖子中提到的,我使用 Paw 作为我的 REST 客户端(比 Postman 更好的原生应用程序)。同样,我提到我在 JSONLint.com 验证了 JSON。也就是说,我确实也通过 Postman 运行了它,并得到了有效的 JSON。【参考方案2】:

我能够通过将 JSON 包装在方括号中来使其工作。

$result = "[" . $result . "]";

【讨论】:

以上是关于Alamofire 无法将结果识别为 JSON的主要内容,如果未能解决你的问题,请参考以下文章

为啥此代码无法将 lista 识别为列表? [关闭]

是否可以让表格将我的 REGEXEXTRACT 结果识别为日期?

无法将json-server项识别为cmdlet

解决VScode安装Babel转码器报错:无法将“cnpm“项识别为cmdlet函数脚本文件或可运行程序的名称的问题

Laravel 5.2 无法将跨域 jQuery 方法识别为 AJAX

Apple Vision - 无法将单个数字识别为区域