Отправить фигурные скобки в URLSession httpBody - PullRequest
0 голосов
/ 08 апреля 2020

Мне нужно сделать запрос POST с использованием URLSession и отправить точный JSON ниже как httpBody. Моя проблема заключается в правильной отправке фигурных и квадратных скобок.

{
  "confirm": true,
  "booking": [
    {
      "sendSms": false,
      "order": "8724897",
      "priority": 2,
      "phone": {
        "description": "Main phone",
        "number": "555444333"
      }
    }
  ]
}

Ниже приводится то, что я использую, и это не работает, так как всегда отправляет квадратные скобки вместо фигурных. Я предполагаю, что это отправка массивов, а не объектов.

let phone = [String:Any]()
    phone["description"] = "Main phone" 
    phone["number"] = "555444333"

let booking = [String:Any]()  
    booking["sendSms"] = false
    booking["order"] = "8724897"
    booking["priority"] = 2
    booking["phone"] = phone

let json = [String:Any]()
    json["confirm"] = true
    json["booking"] = [booking]

Здесь, как это отправляется

let bodyData = try JSONSerialization.data(withJSONObject: json, options: [])
request.httpBody = bodyData

Что вы предлагаете? Спасибо

1 Ответ

0 голосов
/ 08 апреля 2020

Вам необходимо сериализовать json, например, с помощью JSONSerialization.data(withJSONObject:options):

Например,

let phone: [String: Any] = [
    "description": "Main phone",
    "number": "555444333"
]

let booking: [String: Any] = [
    "sendSms": false,
    "order": "8724897",
    "priority": 2,
    "phone": phone
]

let json: [String: Any] = [
    "confirm": true,
    "booking": [booking]
]

do {     
    let data = try JSONSerialization.data(withJSONObject: json)
    ...
} catch {
    print(error)
}

Или вы можете использовать Codable типы, а затем использовать JSONEncoder :

struct Phone: Codable {
    let description: String
    let number: String
}

struct Booking: Codable {
    let sendSms: Bool
    let order: String
    let priority: Int
    let phone: Phone
}

struct Bookings: Codable {
    let confirm: Bool
    let booking: [Booking]
}

let phone = Phone(description: "Main phone", number: "555444333")
let booking = Booking(sendSms: false, order: "8724897", priority: 2, phone: phone)
let bookings = Bookings(confirm: true, booking: [booking])

do {     
    let data = try JSONEncoder().encode(bookings)
    ...
} catch {
    print(error)
}

Вы говорите, что сервер ожидает JSON в следующей форме:

{
  "confirm": true,
  "booking": [
    {
      "sendSms": false,
      "order": "8724897",
      "priority": 2,
      "phone": {
        "description": "Main phone",
        "number": "555444333"
      }
    }
  ]
}

Это то, что сгенерировано выше. Ключ booking - это массив (в квадратных скобках), содержащий только один элемент.

Но вы также можете предположить, что сервер жалуется на квадратные скобки. Интересно, может ли сервер ожидать простой словарь, например,

{
  "confirm": true,
  "booking": {
    "sendSms": false,
    "order": "8724897",
    "priority": 2,
    "phone": {
      "description": "Main phone",
      "number": "555444333"
    }
  }
}

Если booking - это всегда только один элемент, это будет более привычный формат. В этом случае код будет:

let phone: [String: Any] = [
    "description": "Main phone",
    "number": "555444333"
]

let booking: [String: Any] = [
    "sendSms": false,
    "order": "8724897",
    "priority": 2,
    "phone": phone
]

let json: [String: Any] = [
    "confirm": true,
    "booking": booking   // note, not an array, but single item
]

do {     
    let data = try JSONSerialization.data(withJSONObject: json)
    ...
} catch {
    print(error)
}

или

struct Phone: Codable {
    let description: String
    let number: String
}

struct Booking: Codable {
    let sendSms: Bool
    let order: String
    let priority: Int
    let phone: Phone
}

struct Confirmation: Codable {
    let confirm: Bool
    let booking: Booking
}

let phone = Phone(description: "Main phone", number: "555444333")
let booking = Booking(sendSms: false, order: "8724897", priority: 2, phone: phone)
let confirmation = Confirmation(confirm: true, booking: booking)

do {     
    let data = try JSONEncoder().encode(confirmation)
    ...
} catch {
    print(error)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...