web-dev-qa-db-ja.com

swift parse json-正しい形式ではないため、データを読み取ることができませんでした

これが私の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
4
Parameswaran V

これが基本的な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
}

お役に立てれば

1