Json 在Swift中接收Websocket数据

Json 在Swift中接收Websocket数据,json,swift,websocket,vapor,Json,Swift,Websocket,Vapor,我在继续,因为焦点已经改变了 我试图通过websocket从vapor服务器发送字符串数据。客户端是主要问题所在。这段代码成功地接收到字符串,该字符串应该是JSON(但不是绝对保证的——超出范围) 在一些非常有用的指导之后,发送一个字符串,例如“{\“name\”:\“Bobberoo\”}”将打印出来 string: 20 bytes The data couldn’t be read because it isn’t in the correct format. 如果我把它用大括号括起来,

我在继续,因为焦点已经改变了

我试图通过websocket从vapor服务器发送字符串数据。客户端是主要问题所在。这段代码成功地接收到字符串,该字符串应该是JSON(但不是绝对保证的——超出范围)

在一些非常有用的指导之后,发送一个字符串,例如
“{\“name\”:\“Bobberoo\”}”
将打印出来

string: 20 bytes
The data couldn’t be read because it isn’t in the correct format.
如果我把它用大括号括起来,
“[{\“name\”:\“Bobberoo\”}]”
会产生更有用但仍然让我迷惑的输出:

显然,解码正在发生,但它被包装在这些上下文中。它们是什么?我可以看到第一个是WebSocketController的实例。如何访问此数据


顺便说一句:在任何情况下,管理JSON都是一个微不足道的操作。Python/Flask、Node、Ruby/Rails等等;我已经使用了所有这些,实现这种交互非常简单。在斯威夫特,这是一个可怕的,没有充分记录的噩梦。至少,这是我的经验。为什么?我知道该语言是类型安全的,但这很荒谬。

错误。localizedDescription
不会向您提供对调试有用的错误消息。另一方面,如果直接打印
错误

print(error)
您将得到类似“预期解码数组,但找到字典”的内容,这正是在

{
    "name": "Bobberoo"
}
您正在解码一个
[Person].self
,即
Person
的数组,但您的JSON根不是JSON数组。如果您执行以下操作,则可以解码上述JSON:

let people = try decoder.decode(Person.self, from: jsonData)

显然,解码正在发生,但它被包装在这些上下文中。它们是什么

这是类型的默认字符串表示形式。您的
Person
结构不符合
CustomStringConvertible
CustomDebugStringConvertible
TextOutputStreamable
,因此(链接指向
String.init(反射:)
,当您打印
Person
数组时,可能会在某个地方调用它)并用作字符串表示形式

从我所看到的,它当前的实现是结构的完全限定名-从模块开始,然后是顶级类,然后是每个封闭范围,最后是结构名,然后是括号中的结构成员。事实证明,封闭的作用域没有“名称”,因此被称为
(未知上下文位于xxxxx)
。这些都是非常详细的实现细节,以及您不应该关心的事情

您应该做的是提供一个
CustomStringConvertible
的实现:

struct Person: CustomStringConvertible {
    ...

    var description: String { "name: \(name)" }
}
现在打印
people
将提供:

[name: Bobberoo]
我可以看到第一个是
WebSocketController
的实例

否。
WebSocketController
是您的
Person
结构的完全限定名的一部分。您解码的数组中只有一个实例,正如您所期望的,它是
Person
的一个实例

如何访问此数据

要访问其名称,请执行以下操作:

if let firstPerson = people.first {
    let firstPersonsName = firstPerson.name
}

不要打印(error.localizedDescription),而是打印
error
本身。您将得到一条更有用的错误消息。这很有效,非常好。你的回答很清楚,切中要害。作为一个开始学习这一点的人,我真的很感激花时间和精力。许多Swift似乎是“反向发现的”:在帮助上下文中,我了解了CustomStringConvertible,现在我可以研究它了。但我确信这并不是我一直在研究的信息的一部分,这令人沮丧。我的代码中有很多东西都是从别人的教程、课程等中衍生出来的,但这一个细节作为障碍让我感到沮丧。所以我非常感激。
[name: Bobberoo]
if let firstPerson = people.first {
    let firstPersonsName = firstPerson.name
}