用于内部JSON对象的GWT Java覆盖

时间:2013-02-05 13:31:53

标签: java javascript gwt overlay

我有一个关于为JSON对象创建GWT 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)));

}

但这根本不起作用(我也尝试了不同的方法,但没有一种方法有效。)

有人可以告诉我如何使用Java GWT代码中的循环从内部数组“waypoints”访问lon / lats吗?

非常感谢你的回答!

2 个答案:

答案 0 :(得分:3)

首先,你的代码不起作用的原因是因为JavaScript数组在Java土地中表示为JavaScriptObject(当通过JSNI边界时),并且可以更具体地被强制转换为{{1或者在您的情况下为JsArray

那就是说,你最好用Java在JavaScript中映射与JsArrayNumber对象完全相同的结构:

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

我不认为以这种方式展平你的API有任何优势(实际上恰恰相反),所以我宁愿选择更多public native final int getLongitudeCount() /*-{ return this.waypoints.length; }-*/; public native final double getLongitude(int i) /*-{ return this.waypoints[i].longitude; }-*/; 子类来密切映射你的Java结构(如上所述)。

答案 1 :(得分:0)

您可以使用以下JSONParser:

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