2016-11-18 4 views
0

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.

Antwort

0

Offenbar socket.io-client-swift ist nicht in der Lage, Puffer zu behandeln. Ich löste dieses Problem, indem ich den Puffer zu einem Uint8Array und dann zu einem normalen Array umwandelte, bevor ich es über websockets schickte:

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