2012-10-08 36 views
8

Tôi đang cố thực hiện một số thử nghiệm với HTML5, WebSocket và API tệp. Tôi đang sử dụng triển khai WebSocket của Tomcat7. Tôi có thể gửi và nhận tin nhắn văn bản từ servlet. Điều tôi muốn làm bây giờ là gửi từ servlet tới các đối tượng JSON của máy khách, nhưng tôi muốn tránh tin nhắn văn bản để bỏ qua JSON.parse (hoặc tương tự) trên máy khách, vì vậy tôi đang cố gắng gửi các thông điệp nhị phân . Phần servlet là thực sự đơn giản:API tệp - Blob thành JSON

String s = "{arr : [1,2]}"; 
CharBuffer cbuf = CharBuffer.wrap(s);  
CharsetEncoder encoder = Charset.forName("UTF-8").newEncoder();  
getWsOutbound().writeBinaryMessage(encoder.encode(cbuf)); 
getWsOutbound().flush(); 

Sau thông báo này, trên máy khách tôi thấy rằng tôi nhận được một khung nhị phân, được chuyển đổi sang một đối tượng Blob (http://www.w3.org/TR/FileAPI/#dfn-Blob). Câu hỏi đặt ra là: có thể lấy đối tượng JSON từ Blob không? Tôi đã xem giao diện FileReader (http://www.w3.org/TR/FileAPI/#FileReader-interface) và tôi đã sử dụng mã như thế này để kiểm tra xem FileReader có thể làm gì (dòng đầu tiên tạo Blob mới, vì vậy bạn có thể thử nghiệm nếu muốn):

var b = new Blob([{"test": "toast"}], {type : "application/json"}); 
var fr = new FileReader(); 
fr.onload = function(evt) { 
    var res = evt.target.result; 
    console.log("onload",arguments, res, typeof res); 
}; 
fr.readAsArrayBuffer(b); 

sử dụng tất cả các phương thức "readAs ..." mà tôi đã thấy khi triển khai Trình đọc tệp (Tôi đang sử dụng Chrome 22). Dù sao tôi không tìm thấy cái gì hữu ích.

Bạn có đề xuất nào không? Cảm ơn.

+1

Bạn nghĩ thế nào bạn có thể gửi JSON-strings như thông điệp nhị phân? JSON chỉ là một mã hóa cho các đối tượng và bạn thực sự không thể gửi cấu trúc nhị phân phụ thuộc vào triển khai thực hiện xung quanh một số hàm 'parse'. – Bergi

+0

yeah bạn nói đúng, nó không có ý nghĩa gì cả. Cảm ơn! – Antonio

Trả lời

6

Điều bạn đang làm là sai về khái niệm. JSON là một biểu diễn chuỗi của một đối tượng, không phải là một đối tượng. Vì vậy, khi bạn gửi một biểu diễn nhị phân của JSON qua dây, bạn đang gửi một biểu diễn nhị phân của chuỗi. Không có cách nào để phân tích cú pháp JSON ở phía máy khách để chuyển đổi chuỗi JSON thành đối tượng JavaScript.

Bạn hoàn toàn phải gửi JSON dưới dạng văn bản cho khách hàng và bạn phải luôn gọi JSON.parse. Không có gì khác sẽ dễ dàng cho bạn.

+0

Như tôi đã nói với Bergi, và như bạn đã nói lúc đầu, câu hỏi là sai lầm về khái niệm. Cảm ơn bạn. – Antonio

+0

Tuyệt! Tôi có thể hỏi cùng một câu hỏi. –

1

Bạn đã thử readAsText() thay vì readAsArrayBuffer() (JSON là văn bản cuối cùng).

Bạn cũng đã bỏ lỡ để stringify đối tượng (chuyển đổi sang JSON văn bản)

var b = new Blob([JSON.stringify({"test": "toast"})], {type : "application/json"}), 
    fr = new FileReader(); 

fr.onload = function() { 
    console.log(JSON.parse(this.result)) 
}; 

fr.readAsText(b);