【发布时间】:2016-11-18 21:54:36
【问题描述】:
当使用 Alamofire 检索包含字符串和二进制文件的 JSON 时,转换为 JSON 的效果非常好:
Alamofire.request(path, method: .get, parameters: parameters)
.validate()
.responseJSON { response in
switch response.result {
case .success:
print("GET request to '" + path + "' has been successful.")
if let value = response.result.value {
let json = JSON(value)
onCompletion(json as JSON, nil)
}
case .failure(let error):
onCompletion(nil, error as NSError?)
}
}
现在我通过socket.io-client-swift 实现了WebSockets,我想做同样的事情,即接收一个包含字符串和二进制文件的JSON。发送工作正常,但不幸的是没有收到来自服务器的消息。但是,我认为问题在于从NSArray 到JSON 的转换,因为在打印数组时,结果是这样的:
(
{
bin = <ffd8ffe0 00104a46 49460001 [....] 51494b40 05251494 01ffd9>;
userId = 582d6f52b49e931d3fb6d56a;
bla = 1221321424214124214;
type = binary;
}
)
当通过 SwiftyJSON 将此 NSArray 转换为 JSON 时,我得到 unknown。
SocketIO.sharedInstance.onMessage({ data, ack in
print(data) // prints the array above
let json = JSON(data[0])
print(json) // unknown
// do more stuff
})
如果我发送文本而不是 bin,则一切正常。我也尝试使用 JSON(data: data[0]) 初始化器,但由于类型错误,这不起作用。
当我使用以下语句打印传入消息时,对我来说似乎也很奇怪:
socket.on("message") {( dataArray, ack) -> Void in
print("Incoming: ", dataArray);
}
我得到以下输出,这似乎是一个嵌套数组被传输,而不是一个以对象为第一个元素的数组:
Incoming: [["userId": 582d6f52b49e931d3fb6d56a, "bla": 1221321424214124214, "type": binary, "bin": 205083 bytes]]
这可能是什么问题?
编辑:
我注意到通过 REST 和 Socket.io 检索消息时传输的二进制文件不同。具体来说,在 iOS 客户端上,我在使用 REST 时收到以下信息:
bin = {
data = (
255,
216,
255,
224,
0,
[.....],
161,
163,
68,
207,
255,
217
);
type = Buffer;
};
使用 Socket.io 时,我收到这样的信息:
bin = <ffd8ffe0 00104a46 49460001 01000048 [......]>;
虽然在传输之前记录消息时 JSON 看起来是一样的。
【问题讨论】:
标签: json swift websocket socket.io swifty-json