我正在提出此请求:
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解析它,错误:
"无法读取数据,因为格式不正确"。
新手到斯威夫特......所以,先谢谢你的帮助!
编辑:为了清晰起见,编辑了更多信息。再次感谢!
答案 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"
}
答案 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()
}
}