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

时间:2016-11-18 21:54:37

标签: json swift websocket socket.io swifty-json

当使用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看起来是一样的。

1 个答案:

答案 0 :(得分:0)

显然socket.io-client-swift无法处理缓冲区。我通过将缓冲区转换为using System; using System.Linq; namespace ConsoleApplication { class Program { static void Main(string[] args) { int n = 10; Random r = new Random(); int[] a = new int[n]; // Generate some random numbers of different lengths for (int i = 0; i < n; ++i) a[i] = r.Next(Convert.ToInt32(new String('9', r.Next(1, 6)))); // Get length of longest number int maxLength = a.Max(x => x.ToString().Length); // Create array to store padded numbers string[] l = new string[n]; // Get right zero padded numbers for (int i = 0; i < n; ++i) l[i] = a[i].ToString().PadRight(maxLength, '0'); // Print numbers for (int i = 0; i < n; ++i) Console.WriteLine(l[i]); // Wait for key-press Console.WriteLine("\nPress any key..."); Console.ReadKey(); } } } 然后转换为普通数组来解决此问题,然后通过websockets发送它:

Uint8Array