Как написать сериализацию JSON в Swift 4 - PullRequest
0 голосов
/ 27 июня 2018

у меня есть это тело для отправки в бэкэнд `{

    "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]!

Затем попробуйте создать словарь в виде строки, любой, но когда я пытаюсь использовать

попробовать! JSONSerialization.data (withJSONObject: параметры, параметры: .prettyPrinted) я не могу создать правильный файл 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]
}

Ответы [ 2 ]

0 голосов
/ 27 июня 2018

Ответ

Создать правильную структуру, которая соответствует моему 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)
        }

    } 
0 голосов
/ 27 июня 2018

Структура вашей Cart структуры не соответствует структуре вашего 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
}

Создайте значение Cart и затем конвертируйте его в json, используя JSONEncoder.


Некоторые другие предложения:

  • Старайтесь избегать неявных развернутых значений, таких как Int!. Вы столкнетесь с множеством фатальных ошибок, если будете использовать этот код в работе.

  • Вам не нужно переопределять ключи кодирования, если имена ваших полей уже совпадают с ними.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...