如何使用SwiftyJSON将Swift中的二进制JSON转换为?
问题描述:
当使用Alamofire检索包含字符串的一个JSON和二进制,转化为JSON
作品完美的罚款:如何使用SwiftyJSON将Swift中的二进制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看起来是一样的,当在传输消息之前记录消息。
答
显然socket.io-client-swift无法处理缓冲区。我通过将缓冲区转换为Uint8Array
,然后转换为普通阵列,然后通过websocket发送它来解决此问题:
Array.from(new Uint8Array(stored.bin.buffer))