0

Autobeans のコンテキストで配列と JSNI に苦労しています。
私の GWT プロジェクトの 1 つで、JSON を使用してバックエンドからデータを取得します。
クライアントでデータが取得されたら、カスタム視覚化ウィジェット (javascript で開発) を使用して視覚化したいと考えています。

コンポーネントは次のとおりです。

JSON 構造:

{'ids':[1,2,3,4],'data':[[1.0],[1.0,2.0],[1.0,2.0,3.0] ... ]}

基本的に、json ペイロードに 2 つのデータセットがあります。idsは int の配列 ( int[]) であり、dataは float の配列の配列 ( float[][])です。

もちろん、クライアントでデータを解析するにはさまざまな方法があります。AutoBeans を使用することにしました。そこで、json 構造のインターフェイスを定義しました。

AutoBean :

interface MyData {
   List<Integer> ids;
   List<List<Float>> data;
}

データの解析は正常に機能します。

私のカスタム視覚化ウィジェットには、次のようなデータを設定する API 関数があります。

function api_setData(ids,data) {
   //ids should be an Array of Ints
   //data should be an array of array of Floats.
}

問題は、JSNI では通常の Java 配列を使用できないことです。私は使用する必要がありますJsArray

public final native void setData(JsArrayInteger ids,JsArray<JsArrayInteger> data /*-{
       this.api_setData(ids,data);
    }-*/;

そのため、AutoBean プロパティ ( dataおよびids ) を JsArray インスタンスに変換する必要があります。それを行うためのより良い/より良い方法はありますか?

または、 Is that more effective?JSONParserの代わりに使用する必要があるかもしれません。AutoBeans

4

1 に答える 1

3

JSNI に対処する必要がある場合、さらにMyDataクライアント側でのみインターフェイスを使用している場合は、AutoBeans を使用しないでください。代わりに JSON オーバーレイを使用します。

public class MyData extends JavaScriptObject {
   protected MyData() { /* required for JSOs */ }

   public final native JsArrayInteger getIds() /*-{ return this.ids; }-*/;

   public final native JsArray<JsArrayNumber> getData() /*-{ return this.data; }-*/;
}

次に、JSON を解析します。

MyData data = JsonUtils.safeEval(jsonStr);
customVisualizationWidget.setData(data.getIds(), data.getData());

あるいは、setData の解析済みデータのみが必要であると仮定して、単純に を使用しますJavaScriptObject

ウィジェットで:

public final native void setData(JavaScriptObject obj) /*-{
   this.api_setData(obj.ids, obj.data);
}-*/;

JSON を解析してウィジェットに渡す必要がある場合:

customVisualizationWidget.setData(JsonUtils.safeParse(jsonStr));
于 2012-05-31T13:10:01.543 に答える