2012-05-31 4 views
0

Autobeans의 컨텍스트에서 Arrays와 JSNI로 어떻게 든 어려움을 겪고 있습니다.
내 GWT 프로젝트 중 하나에서 JSON을 사용하여 백엔드에서 데이터를 검색합니다.
데이터가 클라이언트에서 검색되면 맞춤 시각화 위젯 (자바 스크립트로 개발 됨)을 사용하여 시각화하고 싶습니다.AutoBean, Arrays/Lists 프로퍼티와 JSNI

JSON 구조 :

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

은 기본적으로 내 JSON 페이로드에 두 개의 데이터 세트를

다음은 구성 요소입니다. IDS는 클라이언트의 데이터를 구문 분석하는 다른 방법이 물론 있습니다 수레 (float[][])

의 배열의 배열의 int (int[]) 및 데이터의 배열입니다. AutoBeans를 사용하기로 결정했습니다. 그래서 json 구조를위한 인터페이스를 정의했습니다.

AutoBean :

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

데이터를 구문 분석 잘 작동합니다.

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

문제는 JSNI로 내가 일반 자바 배열을 사용할 수 없다는 것입니다 :

내 사용자 정의 시각화 위젯은 다음과 같습니다 데이터를 설정하는 API 기능을 가지고 있습니다. JsArray을 사용해야합니다.

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

그래서 나는 나의 AutoBean 특성 (데이터IDS) JsArray 인스턴스로 변환해야합니다. 더 좋고/더 좋은 방법이 있습니까?

어쩌면 JSONParser 대신 AutoBeans 대신 사용해야합니까?

답변

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()); 

다른 방법을, 당신은 단순히 JavaScriptObject를 사용, 당신 사항 setData에 대한 데이터를 구문 분석이 필요 가정. 위젯에서

:

customVisualizationWidget.setData(JsonUtils.safeParse(jsonStr)); 
+0

감사 토마스를 피드백 :

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

당신이 JSON을 구문 분석하고 위젯을 줄 필요가

. AutoBean이 내 사용 사례에 가장 적합하지 않을 수도 있습니다. 나는 JSO와 AutoBean의 성능 관점에서 똑같이 빠르지 만 (내 데이터 배열은 200k float 값을 가질 수있다) –

+0

JSO는 항상 AutoBeans보다 성능이 우수합니다. AutoBeans에는 JSO 주위에 래퍼가 있기 때문입니다. 그들은 매우 래퍼라고 생각하며 필요에 따라 인스턴스화되기 때문에 일반적으로 문제가되지 않습니다. 하지만 여전히. –