Alamofire POST请求替换输出中的字符

时间:2018-06-07 15:53:18

标签: swift alamofire

我正在提出此请求:

Alamofire.request(path,method:.post, parameters:params, encoding: JSONEncoding.default,headers:headers).responseJSON { response in
print("Result: \(response.result.value)"
do {
self.list = try JSONDecoder().decode([list].self, from: result!) for event in self.lists {
print(event.title," : ",event.description)
}

} catch let parseError as NSError {
print("JSON Error \(parseError.localizedDescription)")
}
}

应该看起来像这样的数据(JSON?) - 邮差输出,此处不包括所有字段:

{
"start": "2016-02-01 11:30:00",
"end": "2016-02-01 14:42:24",
"id": 3192,
"ownership": false,
}

在XCode中打印出如下所示:

{
start = "2016-02-01 11:30:00";
end = "2016-04-14 20:30:00";
"id" = 3192;
ownership = 0;
}

结果:我无法使用JSONDecoder解析它,错误:

  

"无法读取数据,因为格式不正确"。

新手到斯威夫特......所以,先谢谢你的帮助!

编辑:为了清晰起见,编辑了更多信息。再次感谢!

3 个答案:

答案 0 :(得分:1)

Alamofire不是"替换输出中的字符",它会给你一个不同的对象而不是你期望的那个。如果您打印出response.result的类型,那么您可能会对NSDictionary感到惊讶。我们值得信赖的朋友print(...)足以将其转换为String代表您传递的内容,但您不太可能使用JSONDecoder解析此问题,因为它是 Data(这是解码器的期望)。

正如我之前所说:使用responseString获取响应并将其转换为适当的Data,以便使用JSONDecoder进行解析。为了能够正确控制此过程,您希望在问题中包含Codable衍生产品,并且可能会在JSONDecoder上设置日期解析策略。

如果没有您的struct以及来自您的回复的一些格式正确的JSON(如果合理完成,Postman将会这样做),我们不太可能为您提供更多帮助。

P.S。:通过编辑改变完全的问题并不是一个好主意。你可能最好发布一个新问题,并在旧问题上留下一个带有指针的评论,这样人们重新访问它可能会导致正确的位置。如果您更新了问题,通常应保留旧问题,并使用其他信息进行修改,以保持现有讨论的相关性。

答案 1 :(得分:0)

作为解决方法,您只需将CodingKey添加到已解码的struct即可。 只需添加到您的struct / class

private enum CodingKeys: String, CodingKey {
    case event_id = "id"
}

请参阅https://benscheirman.com/2017/06/swift-json/

答案 2 :(得分:-1)

我可以建议以下解决方案:

  

首先,你需要一个pojo类来引用你的json对象。最简单的方法   我知道的是名为SwiftyJSON的库   (https://github.com/SwiftyJSON/SwiftyJSON)首先你可以添加它   库到你的项目。然后,您可以创建以下pojo类   为您的输出(可选:您也可以安装   SwiftyJSONAccelarator(https://github.com/insanoid/SwiftyJSONAccelerator)   使用json输出生成pojo类。):

import Foundation
import SwiftyJSON

public class MyOutput: NSObject {

    // MARK: Declaration for string constants to be used to decode and also serialize.
    internal let kMyOutputEndKey: String = "end"
    internal let kMyOutputInternalIdentifierKey: String = "id"
    internal let kMyOutputOwnershipKey: String = "ownership"
    internal let kMyOutputStartKey: String = "start"


    // MARK: Properties
    public var end: String?
    public var internalIdentifier: Int?
    public var ownership: Bool = false
    public var start: String?


// MARK: SwiftyJSON Initalizers
/**
Initates the class based on the object
- parameter object: The object of either Dictionary or Array kind that was passed.
- returns: An initalized instance of the class.
*/
convenience public init(object: AnyObject) {
    self.init(json: JSON(object))
}

/**
Initates the class based on the JSON that was passed.
- parameter json: JSON object from SwiftyJSON.
- returns: An initalized instance of the class.
*/
public init(json: JSON) {
        end = json[kMyOutputEndKey].string
        internalIdentifier = json[kMyOutputInternalIdentifierKey].int
        ownership = json[kMyOutputOwnershipKey].boolValue
        start = json[kMyOutputStartKey].string

    }
}
  

之后用Alomofire调用url并获得响应后,你   可以简单地将输出映射到您的pojo类。最后,你可以使用任何   你班上的字段(在我的例子中是myOutput):

Alamofire.request(path,method:.post, parameters:params, encoding: JSONEncoding.default,headers:headers).responseJSON { response in
            switch response.result {
            case .success(let value):
                let json = JSON(value)
                let myOutput = MyOutput.init(json: json)
                //use myOutput class for your needs
            case .failure( _):
                self.createNetworkErrorPopup()
            }
        }