如何在Swift 4中编写JSON序列化
我有这个身体发送后端`{如何在Swift 4中编写JSON序列化,json,swift,serialization,swift4,Json,Swift,Serialization,Swift4,我有这个身体发送后端`{ "cart": { "products": [ { "id": 3, "quantity": 2 }, { "id": 6,
"cart":
{
"products": [
{
"id": 3,
"quantity": 2
},
{
"id": 6,
"quantity": 1
}
],
"card":
{
"id": "card_21378921w"
}
}
}`
我尝试使用可编码对象创建:
struct Cart: Codable {
var id: Int!
var quantity: Int!
private enum CodingKeys: String, CodingKey {
case id = "id"
case quantity = "quantity"
}
}
var cart: [Cart]!
然后尝试创建一个字典作为字符串,但当我尝试使用
try!JSONSerialization.datawithJSONObject:参数,选项:。预打印
我无法为后端创建正确的json文件,服务器返回状态代码422
我怎么能解决这个问题?我刚开始使用swift 4和codables
作用
static func createCheckout(accessToken: String, buildingId: Int,products:[Cart], card_id: String,completion: @escaping (CommonResponse?, _ error: Int?) -> ()) {
let url = Url.createCheckout(buildingId: buildingId)
let parameters = Params.createCheckout(products: products, card_id: card_id)
if (!JSONSerialization.isValidJSONObject(parameters)) {
print(parameters)
print("is not a valid json object")
return
}
let encodedParameters = try! JSONSerialization.data(withJSONObject: parameters, options: .prettyPrinted)
var request = URLRequest(url: URL(string: url)!)
request.httpMethod = "POST"
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
request.addValue("Bearer \(accessToken)", forHTTPHeaderField: "Authorization")
request.httpBody = encodedParameters
Alamofire.request(request).responseDecodableObject(decoder: JSONDecoder()) { (response: DataResponse<CommonResponse>) in
let repo = response.result.value
let error = response.response?.statusCode
completion(repo, error)
}
Params
static func createCheckout(products:[Cart], card_id: String) -> Dictionary<String, Any> {
let products: [String: Any] = ["products": products]
let card_number: [String: Any] = ["id": card_id]
return ["cart" : products, "card": card_number]
}
购物车结构的结构与json的结构不匹配。请尝试以下操作:
struct Product: Codable {
let id: Int
let quantity: Int
}
struct Card: Codable {
let id: String
}
struct Cart: Codable {
let products: [Product]
let card: Card
}
创建购物车值,然后使用JSONEncoder将其转换为json
其他一些建议:
尽量避免像Int!这样的隐式展开值。如果在生产中使用此代码,您将遇到许多致命错误
如果字段的名称已经匹配,则不需要重新定义编码键
答复
创建与我的JSON匹配的正确结构
struct Checkout: Codable {
var cart: Cart
}
struct Cart: Codable {
var products: [Product]
var card: Card
}
struct Card: Codable {
var id: String
}
struct Product: Codable {
var id, quantity: Int
}
然后使用Alamofire和JSONEncoder正确调用
static func createCheckout(accessToken: String, buildingId: Int,checkout: Checkout,completion: @escaping (_ error: Int?) -> ()) {
let url = Url.createCheckout(buildingId: buildingId)
let encodedData = try? JSONEncoder().encode(checkout)
var request = URLRequest(url: URL(string: url)!)
request.httpMethod = "POST"
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
request.addValue("Bearer \(accessToken)", forHTTPHeaderField: "Authorization")
request.httpBody = encodedData
Alamofire.request(request).responseJSON { response in
let error = response.response?.statusCode
completion(error)
}
}
你如何在你的代码中调用JSONSerialization?你能把它添加到你的帖子中吗?@ChristianAbella我更新了答案,提供了更多细节,对此表示抱歉