Wenn Alamofire eine JSON abrufen verwenden, die Strings sowie ein binäres enthält, um die Konvertierung zu JSON
funktioniert perfekt in Ordnung:Wie konvertiert man binäre JSON in Swift mit SwiftyJSON?
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?)
}
}
Jetzt nämlich ich habe WebSockets über socket.io-client-swift umgesetzt und ich möchte die gleiche Sache zu tun, Empfangen eines JSON, der Zeichenfolgen sowie eine Binärdatei enthält. Das Senden funktioniert einwandfrei, empfängt aber leider keine Nachrichten vom Server. Ich denke jedoch, dass das Problem bei der Umwandlung von einer NSArray
-JSON
, denn wenn die Array Druck, das Ergebnis ist wie folgt:
(
{
bin = <ffd8ffe0 00104a46 49460001 [....] 51494b40 05251494 01ffd9>;
userId = 582d6f52b49e931d3fb6d56a;
bla = 1221321424214124214;
type = binary;
}
)
Wenn diese NSArray
zu JSON über SwiftyJSON Umwandlung, ich unknown
bekommen.
SocketIO.sharedInstance.onMessage({ data, ack in
print(data) // prints the array above
let json = JSON(data[0])
print(json) // unknown
// do more stuff
})
Wenn ich Text anstelle von bin
sende, funktioniert alles gut. Ich habe auch versucht, den JSON(data: data[0])
Initialisierer zu verwenden, aber das funktioniert nicht wegen eines falschen Typs.
Was auch für mich scheint seltsam ist, wenn ich die eingehende Nachricht mit der folgenden Aussage zu drucken:
socket.on("message") {(dataArray, ack) -> Void in
print("Incoming: ", dataArray);
}
ich die folgenden Ausgabe, die scheint, dass eine verschachtelte Array übertragen wurde, und nicht ein Array, das hat ein Objekt als erstes Element:
Was könnte das Problem hier sein?
EDIT:
bemerkte ich, dass die übertragene binäre unterscheidet, wenn Nachrichten über REST und Socket.io abgerufen werden. Um genau zu sein, auf dem iOS-Client, erhalte ich die folgende wenn REST verwenden:
bin = {
data = (
255,
216,
255,
224,
0,
[.....],
161,
163,
68,
207,
255,
217
);
type = Buffer;
};
Wenn Socket.io verwenden, erhalte ich es wie folgt aus:
bin = <ffd8ffe0 00104a46 49460001 01000048 [......]>;
Obwohl die JSON gleich aussieht, wenn Protokollieren der Nachricht direkt vor dem Senden.