0

我有一个关于为 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 代码中的循环从内部数组“航路点”访问 lon/lats 吗?

非常感谢您的回答!

4

2 回答 2

3

首先,您的代码不起作用的原因是因为 JavaScript 数组JavaScriptObject在 Java 中表示为 a (当通过 JSNI 边界时),并且可以更具体地转换为 aJsArray或在您的情况下为 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()将构造一个 Array 只是为了读取它的长度,并且您将在每次迭代时都这样做;而不仅仅是使用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 中的结构(如上所述)。

于 2013-02-05T14:32:36.930 回答
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();

等等

于 2013-02-05T14:37:54.097 回答