如何在iOS Swift中使用Alamofire获得JSON响应?

我一直在尝试使用alamofire从url获得json响应。创建了模型,apirouter和api客户端类。

显示错误

 failure(Alamofire.AFError.responseSerializationFailed(reason: 
  Alamofire.AFError.ResponseSerializationFailureReason.decodingFailed(error: 
   Swift.DecodingError.keyNotFound(CodingKeys(stringValue: "variables",intvalue: nil),Swift.DecodingError.Context(codingPath: [_JSONKey(stringValue: "Index 0",intvalue: 0)],debugDescription: "No value associated with key CodingKeys(stringValue: \"variables\",intvalue: nil) (\"variables\").",underlyingError: nil)))))

这是我的邮递员json回复:

   [
{
    "id": "00602c70-fc8a-11e9-ad1d-2abe2670111d","resourceType": "Task","name": "My Tasks","owner": null,"query": {
        "assigneeExpression": "${currentUser()}","taskVariables": [],"processVariables": [],"caseInstanceVariables": [],"orQueries": []
    },"properties": {
        "variables": [
            {
                "name": "loanAmount","label": "Loan Amount"
            },{
                "name": "firstName","label": "First Name"
            }
        ],"color": "#555555","showUndefinedVariable": false,"description": "Tasks assigned to me","refresh": false,"priority": -10
      }
    }
   ]

我试图从json响应中获取 id,名称和属性->变量->名称和标签的值。

这是模型类别:

  import Foundation

public struct Filter: Codable {

let id: String
let name: String
let properties: [variables]


}

public struct variables: Codable {

   let name: String
   let label: String

}

以下是alamofire的代码:

    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 getFilter(completion:@escaping (AFResult<[Filter]>)->Void) {
       let jsonDecoder = JSONDecoder()
    performRequest(route: APIRouter.getFilter,decoder: jsonDecoder,completion: completion)
   }

任何帮助都非常感谢...

conqueror_nannan 回答:如何在iOS Swift中使用Alamofire获得JSON响应?

您的模型类应如下所示。

import Foundation

public struct Filter: Codable {

let id: String
let name: String
let properties: Properties


}

public struct Properties: Codable {
   let variables: [variables]
   let color: String
   let showUndefinedVariable: Bool
   let description: String
   let refresh: Bool
   let priority: Int

}

public struct variables: Codable {

   let name: String
   let label: String

}
,

您尝试过这个吗?这应该是

<div id='wrapper'>
  <div id='arrow'></div>
  <table>
    <tr>
      <td >0</td>
      <td>1</td>
      <td>2</td>
      <td>3</td>
      <td>4</td>
      <td>5</td>
      <td>6</td>
      <td>7</td>
      <td>8</td>
      <td id="end">9</td>
    </tr>
    <tr>
      <td>0</td>
      <td>1</td>
      <td>2</td>
      <td>3</td>
      <td>4</td>
      <td>5</td>
      <td>6</td>
      <td>7</td>
      <td>8</td>
      <td>9</td>
    </tr>
    <tr>
      <td>0</td>
      <td>1</td>
      <td>2</td>
      <td>3</td>
      <td>4</td>
      <td>5</td>
      <td>6</td>
      <td>7</td>
      <td>8</td>
      <td>9</td>
    </tr>
    <tr>
      <td>0</td>
      <td>1</td>
      <td>2</td>
      <td>3</td>
      <td>4</td>
      <td>5</td>
      <td>6</td>
      <td>7</td>
      <td>8</td>
      <td>9</td>
    </tr>
    <tr>
      <td>0</td>
      <td>1</td>
      <td>2</td>
      <td>3</td>
      <td>4</td>
      <td>5</td>
      <td>6</td>
      <td>7</td>
      <td>8</td>
      <td>9</td>
    </tr>
    <tr>
      <td>0</td>
      <td>1</td>
      <td>2</td>
      <td>3</td>
      <td>4</td>
      <td>5</td>
      <td>6</td>
      <td>7</td>
      <td>8</td>
      <td>9</td>
    </tr>
    <tr>
      <td>0</td>
      <td>1</td>
      <td>2</td>
      <td>3</td>
      <td>4</td>
      <td>5</td>
      <td>6</td>
      <td>7</td>
      <td>8</td>
      <td>9</td>
    </tr>
    <tr>
      <td>0</td>
      <td>1</td>
      <td>2</td>
      <td>3</td>
      <td>4</td>
      <td>5</td>
      <td>6</td>
      <td>7</td>
      <td>8</td>
      <td>9</td>
    </tr>
    <tr>
      <td>0</td>
      <td>1</td>
      <td>2</td>
      <td>3</td>
      <td>4</td>
      <td>5</td>
      <td>6</td>
      <td>7</td>
      <td>8</td>
      <td>9</td>
    </tr>
    <tr>
      <td id="start">0</td>
      <td>1</td>
      <td>2</td>
      <td>3</td>
      <td>4</td>
      <td>5</td>
      <td>6</td>
      <td>7</td>
      <td>8</td>
      <td>9</td>
    </tr>
  </table>
</div>
,

您收到的错误消息非常清楚:No value associated with key CodingKeys(stringValue: \"variables\"

您正在尝试将JSON解码为Filter结构,但是JSON没有variables属性。您可以通过引入一个新的Properties结构来解决此问题,该结构将包裹variables属性,如下所示:

struct Filter: Codable {
    let id: String
    let name: String
    let properties: Properties
}

struct Properties: Codable {
    let variables: Variables
}

struct Variables: Codable {
    let name: String
    let label: String
}

此外,正如您在本片段中所看到的,习惯上是在CamelCase中编写类型名称,所以用struct Variables代替struct variables

本文链接:https://www.f2er.com/3104064.html

大家都在问