2012-02-15 9 views
5

私はクライアント側でGoogle Visualization APIを使用しており、DataTableオブジェクトを作成します。それを私のサーバーに渡し、スプレッドシートAPIを介してスプレッドシートにアップロードしたいと思います。おそらく最も良い方法はJSONを使用することです。そのため、メソッドtoJSON()を使用して変換し、POST経由でサーバーに送信しました。今、私は、少なくともではないJSON上で、これらの2つのクラスに互換性がないことに、気づいJavaScriptからJavaへのDataTableオブジェクトの受け渡し

:私はこれらの2つのクラスを使用しようとしました。 JavaScriptクラスは、これに例えば変換:

{"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)"}]} 
     ] 
} 

が、Java側のDataTableには、パラメータに異なる名前を持っている、と私は別の型の値を持つGson使用しています:

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

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

を私は怖いですより多くの非互換性があることを示します。

ですが、どうやってJavaScriptデータテーブルをJavaオブジェクトのDataTableに変換できますか?

+0

1つの列に2つの値を設定できますか? :) – supertopi

+1

これはgoogleの例です(JavaScript DataTableの最初のリンク)。あなたは正しい、私は例を修正したが、それは質問のポイントではない;) – lmazgon

答えて

2

私は逆に同じ問題に遭遇しました。 JavaデータソースライブラリのDataTableオブジェクトは、Google Visualization APIのJavascript DataTableオブジェクトと平行ではないようです。

Javaデータソースライブラリを返すDataTableオブジェクトでは、デフォルトのシリアル化ではなく、JsonRendererを使用する必要があります。そして、サーバーからクライアントに渡って作業するだけであるように見えます。それが他の方向に行えるかどうかはわかりません。

@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; 
    } 

ただし、デフォルトの直列化によって返されたJava DataTableオブジェクトには、Googleの可視化APIのJavaScriptのDataTableと同じものではありません。それをGVisグラフに渡すことはできません。

代わりに、JavaからJsonRendererクラス(see this Google Groups email)を使用して、Jsonのような文字列に変換し、控えめな圧縮の属性の引用符がありません。

文字列が例( see this Google Group forum)内のオブジェクト・リテラル表記には示されていない、括弧で囲むことによってJavaScriptで解析できる
@Path("/hello/") 
    @GET 
    @Produces(MediaType.TEXT_PLAIN) 
    public String getDataTable() { 
     DataTable data = new DataTable(); 
     CharSequence charSequence = JsonRenderer.renderDataTable(dataTable, true, true); 
     return charSequence.toString(); 
    } 

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); 
     ... 
}); 

Iに行くための方法が表示されませんJavaデータソースライブラリのDataTableオブジェクトとは逆の方法です。 そうではない、かなりの答えがありますがまあ、私はフロントエンド上のバックエンドとGWTでのpythonを使用してバックエンドからフロントエンドへのDataTableを渡しています

0

だけではありませんが、何の問題もなく動作します。 バックエンドでgoogle-visualization-python apiを使用してDataTableを作成しています。私はまた、保存されたJSON文字列でも正常に動作のlocalStorageでJSON文字列を格納するために戻ってJSONに解析されたDataTableを変換し、解析する

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


解析は、次のコードで行われます。

GWT DataTableは、JSNIを介して最終的には基礎となるJavascript DataTableの機能を呼び出すだけの単純なラッパーです。私はそれらが互換性がない理由はありません。

最新のgwt-visualization API(1.1.2)を使用していることを確認してください。

+0

Aha。 DataTableオブジェクトを持つ2つのJavaライブラリがあります:[GWT DataTable](http://code.google.com/p/gwt-google-apis/source/browse/trunk/visualization/visualization/src/com/google/gwt/視覚化/クライアント/ DataTable.java?r = 1153)と[Javaデータソースライブラリのデータテーブル](http://code.google.com/apis/chart/interactive/docs/dev/dsl_javadocs/com/google/visualization/datasource/ datatable/DataTable.html)。 GWT DataTableはJavascriptオブジェクトの直接のアナログであるように見え、データソースライブラリは少しの努力で変換する必要があります。 – prototype

関連する問題