2013-02-05 46 views
0

我有一個關於爲JSON對象創建GWT Java覆蓋的問題。GWT內部JSON對象的Java覆蓋

"flightTracks": [ 
{ 
"flightId": 287679776, 
"carrierFsCode": "AA", 
"flightNumber": "100", 
"departureAirportFsCode": "JFK", 
"arrivalAirportFsCode": "LHR", 
"departureDate": { 
"dateLocal": "2013-02-05T18:15:00.000", 
"dateUtc": "2013-02-05T23:15:00.000Z" 
}, 
"equipment": "777", 
"bearing": 51.350983507381706, 
"positions": [], 
"waypoints": [ 
{ 
"lon": -73.76667022705078, 
"lat": 40.63333511352539 
}, 
.....many different waypoints here......... 
{ 
"lon": -73.76667022705078, 
"lat": 40.61666488647461 
}, 
], 

我被告知內部字段「waypoints」是一個數組,它可以通過以下方式訪問。

public final native double getWaypointsLatitude() /*-{ 
    return this.waypoints[0].lat; 
}-*/; 

使用這種方法,我只是得到了雙重價值的位置0 但我需要被包含在陣列中的所有位置。

我也試過這樣:

public static final native double[] getLongitude() /*-{ 

    var longitudes = new Array(); 

    { 
     for (i = 0; i < this.waypoints.length; i++) { 
      longitudes[i] = this.waypoints[i]; 
     } 
    } 

    return longitudes; 
}-*/; 

後來,我想從我的GWT Java代碼中訪問此方法,做一些這樣的:

for(int i = 0; i< entry.getLongitude().length; i++){ 
hp.add(new Label(""+ entry.getLongitude(i))); 

} 

但不是在工作所有的(我也嘗試了不同的方法,但它們都不起作用)。

有人能告訴我如何使用Jav中的循環從內部數組「waypoints」訪問lon/lats一個GWT代碼?

非常感謝你的回答!

回答

3

首先,您的代碼無法工作的原因是因爲Java Array中的JavaScript Array表示爲JavaScriptObject(通過JSNI邊界時),並且可以更具體地將其轉換爲JsArray,或者在您的情況下爲a JsArrayNumber

這就是說,你在Java中最好的地圖,你在JavaScript中有相同的結構,具有Coordinates對象:

public class Coordinates extends JavaScriptObject { 
    protected Coordinates() { } 

    public final native double getLatitude() /*-{ return this.latitude; }-*/; 
    public final native double getLongitude() /*-{ return this.longitude; }-*/; 
} 

而在FlightTrack對象:

public final native JsArray<Coordinates> getWaypoints() /*-{ return this.waypoints; }-*/; 

你然後可以在您的航點上循環並提取其經度:

JsArray<Coordinate> waypoints = entry.getWaypoints(); 
for (int i = 0, l = waypoints.length(); i < l; i++) { 
    hp.add(new Label("" + waypoints.get(i).getLongitude()); 
} 

注意:您的for循環未進行優化:getLongitude()只是爲了讀取其長度而構建數組,並且每次迭代時都會這樣做;而不是僅僅使用getLongitudeCount()

public native final int getLongitudeCount() /*-{ return this.waypoints.length; }-*/; 
public native final double getLongitude(int i) /*-{ return this.waypoints[i].longitude; }-*/; 

我不認爲壓扁你的API這種方式有什麼好處,雖然(恰恰相反實際上),所以我寧願有更多JavaScriptObject子類的映射緊密的結構,去Java(如上所述)。

+0

再次非常感謝您的幫助! –

+0

我剛試過,它效果很好!你真的救了我的屁股隊友! –

+0

標記爲答案...? –

0

可以使用JSONParser ASO如下:

JSONValue root = JSONParser.parseStrict(jsonString); 
JSONObject obj = root.isObject(); 
JSONValue waypoints = obj.get("waypoints"); 
JSONNumber lon = obj.get("lon").isNumber(); 
double num = lon.doubleValue(); 

+0

非常感謝。我會嘗試這兩種解決方案! –