2012-02-15 37 views
5

Tôi đang sử dụng API Google Visualization ở phía máy khách và tôi tạo một đối tượng DataTable. Sau đó, tôi muốn chuyển nó đến máy chủ của tôi và tải nó qua API bảng tính vào bảng tính. Có lẽ cách tốt nhất là sử dụng JSON, vì vậy tôi đã chuyển đổi nó bằng phương thức toJSON() và gửi nó qua POST tới máy chủ của tôi. Tôi cố gắng để sử dụng các lớp học 2:Chuyển đối tượng DataTable từ JavaScript sang Java

Bây giờ tôi nhận thấy, rằng những 2 lớp không tương thích, ít nhất là không qua JSON. Lớp JavaScript chuyển đổi ví dụ như thế này:

{"cols":[ 
     {"id":"Col1","label":"","type":"string"} 
     {"id":"Col2","label":"","type":"date"} 
     ], 
"rows":[ 
     {"c":[{"v":"a"},{"v":"Date(2010,10,6)"}]}, 
     {"c":[{"v":"b"},{"v":"Date(2010,10,7)"}]} 
     ] 
} 

Nhưng Java phía DataTable có tên gọi khác nhau cho các thông số, và tôi đang sử dụng Gson trong đó có giá trị loại khác nhau:

cols -> columns 
c -> cells 
v -> value 

type:"string" -> type:"TEXT" 
type:"number" -> type:"NUMBER" 

Và tôi sợ thậm chí còn có nhiều không tương thích hơn nữa.

Vậy .. làm cách nào để chuyển đổi Bảng dữ liệu JavaScript sang đối tượng Java DataTable?

+0

bạn có thể có hai giá trị trong một cột không? :) – supertopi

+1

Đó chỉ là một ví dụ từ google (liên kết đầu tiên cho JavaScript DataTable). Bạn nói đúng, tôi đã sửa lại ví dụ, nhưng đó không phải là điểm của câu hỏi;) – lmazgon

Trả lời

2

Tôi đã gặp phải vấn đề tương tự ngược lại. Dường như đối tượng DataTable trong Thư viện dữ liệu Java không song song với đối tượng DataTable của Javascript trong API hình ảnh hóa của Google.

Trả về đối tượng Datasource của Thư viện dữ liệu Java yêu cầu sử dụng JsonRenderer, thay vì tuần tự hóa mặc định. Và nó xuất hiện chỉ để làm việc đi từ máy chủ cho khách hàng. Không chắc chắn nếu nó có thể được thực hiện theo hướng khác.

@WebService 
@Path("/tables") 
public class DataManager extends GenericManager<db, Long> { 

    @Path("/hello/") 
    @GET 
    @Produces(MediaType.APPLICATION_JSON) 
    public DataTable getDataTable() { 
     DataTable data = new DataTable(); 
     ... populate object ... 
     return data; 
    } 

Tuy nhiên, đối tượng DataTable Java được trả về theo tuần tự mặc định không giống với API dữ liệu JavaScript của Google Visualization API. Bạn không thể chuyển nó vào biểu đồ GVis. Thay vào đó, từ Java, bạn sử dụng lớp JsonRenderer (see this Google Groups email) để chuyển đổi nó thành một chuỗi giống như Json thiếu dấu ngoặc kép quanh các thuộc tính để nén khiêm tốn.

@Path("/hello/") 
    @GET 
    @Produces(MediaType.TEXT_PLAIN) 
    public String getDataTable() { 
     DataTable data = new DataTable(); 
     CharSequence charSequence = JsonRenderer.renderDataTable(dataTable, true, true); 
     return charSequence.toString(); 
    } 

chuỗi Điều đó có thể được phân tích trong Javascript bởi xung quanh với ngoặc, không được hiển thị trong đối tượng ký hiệu chữ trong các ví dụ (see this Google Group forum):

jQuery.ajax({ 
    context: this, 
    type: 'Get', 
    url: url, 
    success: function(data) { 
     var args = eval('('+data+')'); // add parens around the returned string       
     var dataTable = new google.visualization.DataTable(args); 
     ... 
}); 

Tôi không thấy một phương pháp để đi theo ngược lại với đối tượng Datasource Library DataTable của Thư viện Java. Vì vậy, không hoàn toàn là câu trả lời nhưng bạn không đơn độc

0

Vâng tôi đang sử dụng python trên backend và GWT trên giao diện người dùng và chuyển một DataTable từ backend sang frontend hoạt động mà không gặp bất kỳ vấn đề nào. Tôi đang sử dụng google-visualization-python api trên chương trình phụ trợ để tạo DataTable.
Parsing được thực hiện với đoạn mã sau:

DataTable dataTable = DataTable.create(JSONParser.parseLenient(data).isObject().getJavaScriptObject()); 

Tôi cũng chuyển đổi các DataTable phân tích cú pháp JSON trở lại để lưu trữ các chuỗi json trong localStorage và phân tích các chuỗi json lưu trữ cũng hoạt động tốt.

GWT DataTable chỉ là một trình bao bọc đơn giản mà cuối cùng chỉ cần gọi hàm của Javascript cơ bản DataTable qua JSNI.Vì vậy, tôi không thấy bất kỳ lý do nào khiến chúng không tương thích.

Đảm bảo bạn sử dụng gwt-visualization API (1.1.2) mới nhất?

+0

Aha. Có hai thư viện Java với các đối tượng DataTable: [GWT DataTable] (http://code.google.com/p/gwt-google-apis/source/browse/trunk/visualization/visualization/src/com/google/gwt/ visualization/client/DataTable.java? r = 1153) và [DataTable Library DataTable] của Java (http://code.google.com/apis/chart/interactive/docs/dev/dsl_javadocs/com/google/visualization/datasource/ datatable/DataTable.html). Có vẻ như GWT DataTable là một tương tự trực tiếp của đối tượng Javascript và Thư viện Datasource phải được chuyển đổi với một chút nỗ lực. – prototype

Các vấn đề liên quan