我有一个关于为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吗?
非常感谢你的回答!
答案 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();
等