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
 },
],

内部フィールド「ウェイポイント」は配列であり、次の方法でアクセスできると言われています。

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

この方法では、位置 0 で double 値を取得するだけです。ただし、配列に含まれるすべての位置が必要になります。

私もこれを試しました:

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コードでループを使用して、内側の配列「ウェイポイント」から経度/緯度にアクセスする方法を教えてください。

すでに回答ありがとうございます!

4

2 に答える 2

3

まず、コードが機能しない理由は、JavaScript 配列がJavaScriptObjectJava ランドで (JSNI 境界を通過したときに) として表され、より具体的には aJsArrayまたはあなたの場合は aとしてキャストできるためJsArrayNumberです。

そうは言っても、Coordinatesオブジェクト を使用して、JavaScript にあるのとまったく同じ構造を Java にマッピングすることをお勧めします。

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で構造を密接にマッピングするサブクラスを増やしたいと思います。

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

于 2013-02-05T14:37:54.097 に答える