【发布时间】:2021-05-06 08:04:26
【问题描述】:
我在 from this question 上进行此操作,因为焦点已经改变。
我正在尝试通过 websocket 从蒸汽服务器发送字符串数据。客户端是主要问题所在。此代码成功接收字符串,该字符串应为 JSON(但不能绝对保证 -- 超出范围)。
switch message {
case .data(let data):
print("data: \(data)")
case .string(let str):
// let data = str.message(using: .utf8)
let jsonData = Data(str.utf8)
print("string: \(jsonData)")
do {
struct Person : Codable {
var name: String
}
let decoder = JSONDecoder()
let people = try decoder.decode([Person].self, from: jsonData)
print("result: \(people)")
} catch {
print(error.localizedDescription)
}
}
经过一些非常有用的指导后,发送"{\"name\": \"Bobberoo\"}" 之类的字符串会打印出来
string: 20 bytes
The data couldn’t be read because it isn’t in the correct format.
如果我将它包裹在大括号 "[{\"name\": \"Bobberoo\"}]" 中,会产生更有用但(对我而言)仍然神秘的输出:
result: [wb2_socket_client.WebSocketController.(unknown context at $101a35028).(unknown context at $101a350c0).(unknown context at $101a35158).Person(name: "Bobberoo")]
显然,解码正在发生,但它包含在这些上下文中。这些是什么?我可以看到第一个是 WebSocketController 的实例。如何访问这些数据。
除了非煽动性之外:管理 JSON 在任何情况下都是一项微不足道的操作。 Python/Flask、Node、Ruby/Rails 等等;我已经使用了所有这些并且实现这种交互是微不足道的。在 Swift 中,这是一场可怕的、文献资料不足的噩梦。至少,这是我的经验。为什么?我知道这种语言是类型安全的,但这太荒谬了。
【问题讨论】:
-
不要
print(error.localizedDescription),打印error本身。您将收到更有用的错误消息。
标签: json swift websocket vapor