gpt4 book ai didi

json - 如何使用 SwiftyJSON 在 Swift 中转换二进制 JSON?

转载 作者:行者123 更新时间:2023-11-30 12:53:31 33 4
gpt4 key购买 nike

当使用 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。发送工作正常,但不幸的是没有从服务器接收消息。但是,我认为问题在于从 NSArrayJSON 的转换,因为打印数组时,结果是这样的:

(
{
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 ,然后转换为普通数组,然后通过 websockets 发送它来解决这个问题:

Array.from(new Uint8Array(stored.bin.buffer))

关于json - 如何使用 SwiftyJSON 在 Swift 中转换二进制 JSON?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40686532/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com