これが私のJSON応答値です。
{
"_embedded": {
"task": [
{
"_embedded": {
"variable": [
{
"_links": {
"self": {
"href": "/process-instance/412a03b7-06ae-11ea-8860-120ef5ab2c25/variables/loanAmount"
}
},
"_embedded": null,
"name": "loanAmount",
"value": "650000",
"type": "String",
"valueInfo": {}
}
]
},
"id": "412a2aca-06ae-11ea-8860-120ef5ab2c25",
"name": "Quick Evaluation",
"assignee": "demo",
"created": "2019-11-14T07:13:27.558+0000",
"processDefinitionId": "quickEvaluation:1:129ce2b1-0616-11ea-8860-120ef5ab2c25"
}
]
},
"count": 13
}
これがstructコーディング可能なコードです:
import Foundation
public struct TaskID: Codable {
let embedded: Embedded
}
public struct Embedded: Codable {
let task: [Task]
}
public struct Task : Codable {
let embedded: EmbeddedVariable
let id : String
let name: String
let assignee: String
let created: String
let processDefinitionId: String
}
public struct EmbeddedVariable: Codable {
let variable : [Variables]
}
public struct Variables: Codable {
let value : String
let name: String
}
私はcodingKeyを試してみましたが、_embeddedも使用してみました。同じ問題に直面しています。
エラーログ:エラーのため、応答をデコードできませんでした:
Alamofire.AFError.
ResponseSerializationFailureReason.decodingFailed(error: Swift.DecodingError.typeMismatch(Swift.Dictionary<Swift.String, Any>, Swift.DecodingError.Context(codingPath: [], debugDescription: "Expected to decode Dictionary<String, Any> but found an array instead.", underlyingError: nil)))))
正しい形式ではないため、データを読み取ることができませんでした。
JSONSerializationのコードは次のとおりです。
// MARK: - URLRequestConvertible
func asURLRequest() throws -> URLRequest {
let url = try K.ProductionServer.baseURL.asURL()
var urlRequest = URLRequest(url: url.appendingPathComponent(path))
print(urlRequest)
// HTTP Method
urlRequest.httpMethod = method.rawValue
let authToken = UserDefaults.standard.string(forKey: "authToken")
let bearerToken: String = "Bearer " + (authToken ?? "")
print("baearer token::\(bearerToken)")
// Common Headers
urlRequest.setValue(ContentType.json.rawValue, forHTTPHeaderField: HTTPHeaderField.acceptType.rawValue)
urlRequest.setValue(ContentType.json.rawValue, forHTTPHeaderField: HTTPHeaderField.contentType.rawValue)
urlRequest.setValue(bearerToken, forHTTPHeaderField: HTTPHeaderField.authentication.rawValue)
// Parameters
if let parameters = parameters {
do {
urlRequest.httpBody = try JSONSerialization.data(withJSONObject: parameters, options: [])
} catch {
throw AFError.parameterEncodingFailed(reason: .jsonEncodingFailed(error: error))
}
}
return urlRequest
}
次に、コードjsonの応答を示します。
import Foundation
import Alamofire
public class APIClient {
@discardableResult
private static func performRequest<T:Decodable>(route:APIRouter, decoder: JSONDecoder = JSONDecoder(), completion:@escaping (AFResult<T>)->Void) -> DataRequest {
return AF.request(route)
.responseDecodable (decoder: decoder){ (response: AFDataResponse<T>) in
completion(response.result)
print("framework response::",response.result)
}
}
public static func taskID(id: String, completion:@escaping (AFResult<MyTaskData>)->Void) {
performRequest(route: APIRouter.TaskById(id: id), completion: completion)
}
}//APIClient
これが基本的なAlamofireリクエストです。次の構造解析jsonを使用してもエラーは発生しません。
Alamofire.request(url, headers: headers).responseJSON { response in
switch response.result {
case .success(let value):
let jsonData = value as! NSDictionary
completionHandler(jsonData, nil)
print("****** JSON \(jsonData)")
case .failure(let error):
completionHandler(nil, error)
}
ここでは、コード内に配置しました。以下に示すようなヘッダーを試してみてください。適切なヘッダーを入力する必要があります。
func asURLRequest() throws -> URLRequest {
let url = try K.ProductionServer.baseURL.asURL()
var urlRequest = URLRequest(url: url.appendingPathComponent(path))
print(urlRequest)
// HTTP Method
urlRequest.httpMethod = method.rawValue
let authToken = UserDefaults.standard.string(forKey: "authToken")
let bearerToken: String = "Bearer " + (authToken ?? "")
print("baearer token::\(bearerToken)")
// Common Headers
//urlRequest.setValue(ContentType.json.rawValue, forHTTPHeaderField:
//HTTPHeaderField.acceptType.rawValue)
//urlRequest.setValue(ContentType.json.rawValue, forHTTPHeaderField:
//HTTPHeaderField.contentType.rawValue)
//urlRequest.setValue(bearerToken, forHTTPHeaderField:
//HTTPHeaderField.authentication.rawValue)
let headers: HTTPHeaders = [
"Content-Type": "application/json",
"Authorization": "Basic " + currentToken
]
Alamofire.request(url, headers: headers).responseJSON { response in
switch response.result {
case .success(let value):
let jsonData = value as! NSDictionary
completionHandler(jsonData, nil)
print("****** JSON \(jsonData)")
case .failure(let error):
completionHandler(nil, error)
}
//return urlRequest
}
お役に立てれば