【问题标题】:Send curly brackets in URLSession httpBody在 URLSession httpBody 中发送大括号
【发布时间】:2020-07-21 04:17:08
【问题描述】:

我需要使用 URLSession 发出 POST 请求,并将下面的确切 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

你有什么建议? 谢谢

【问题讨论】:

  • 在您使用该字典设置 http 正文的位置添加代码
  • 当您说“我的问题是正确发送大括号和方括号”时,您是什么意思?使用JSONSerialization.data(withJSONObject:options:)(正如您在修改后的问题中所包含的那样)可以为您做到这一点。为什么你认为大括号/方括号有问题?只要看看String(data: bodyData, encoding: .utf8)!,你就会发现一切都很好。
  • 不相关,但您真的是要发送带有确认信息的预订数组吗?还是你的意思是json["booking"] = booking
  • 服务器接收到的所有括号都是方括号。
  • “服务器接收到的所有括号都是方括号。”不,查看String(data: bodyData, encoding: .utf8)!,您可以清楚地看到唯一的方括号围绕您的预订数组,我想知道您是否真的打算成为一个预订,而不是它们的数组。

标签: json swift http post


【解决方案1】:

您需要序列化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)
}

【讨论】:

  • 你好罗,非常感谢!看起来问题不在请求正文中。不相关,您建议使用可编码结构吗?
  • 一般来说,是的,但使用任何你想要的。但我们喜欢 Codable 类型,因为它强制执行键名,从而更难在手动构建字典时容易引入的键中出现拼写错误。
猜你喜欢
  • 2012-03-04
  • 1970-01-01
  • 1970-01-01
  • 2017-12-31
  • 2019-02-25
  • 1970-01-01
  • 1970-01-01
  • 2016-12-04
相关资源
最近更新 更多