2012-01-27 6 views
0

gwtでjsonを構文解析しようとしていますが、動作しません。私は初心者なので、これは明らかな愚かな間違いかもしれません。アレイは正しく収集されません。オーバーレイシステムでgwt jsonシリアライゼーションを動作させることはできません - 配列は常に空です。

これは私がデバッグだWICH上のコードの一部です:

String json = "{\"lokacije\":[{\"sifraLokacije\":1,\"nazivLokacije\":\"Policijska stanica\",\"brojDokumenata\":70}],\"status\":1}"; 
LocationsResponse locationsResponse = createLocationsResponse("("+json+")"); 
// this is ok, status is 1 
int status = locationsResponse.getStatus(); 
// length of this array is 0 and you can see from json that it has one element (the same if it has more) 
int brojLokacija = locationsResponse.getLokacije().length(); 

...

private final native LocationsResponse createLocationsResponse(String json) /*-{ 
    return eval(json); 
}-*/; 

LocationsResponseクラス:

public class LocationsResponse extends JavaScriptObject { 

    protected LocationsResponse() {} 

    public final native int getStatus() /*-{ return this.status; }-*/; 

    public final native JsArray<JSOLokacija> getLokacije() /*-{ this.lokacije; }-*/; 

} 

JSOLokacijaクラス:

public class JSOLokacija extends JavaScriptObject { 

    protected JSOLokacija() {} ; 

    public final native int getSifraLokacije() /*-{ this.sifraLokacije; }-*/; 

    public final native String getNazivLokacije() /*-{ this.nazivLokacije; }-*/; 

    public final native int getBrojDokumenata() /*-{ this.brojDokumenata; }-*/; 

} 
+1

JSNIメソッドでリターンがありませんでした。ただ私を無視する。私はちょうどTwighlightを見たように感じ、私の人生の3時間を捨てて... –

答えて

1

2回目の編集:うわー、今日は役に立たない。私の最初の答えはJSONValueを返しました.JSOを使って作業したいのであれば、かなり迷惑です。

編集:Aaandはあなたのコメントを気付いただけです...まだ、提供されているツールを使用すると、このような迷惑な状況に陥るのを防ぐのに役立ちます。

これはJSのオブジェクトだけでなく、JSONを使用している場合の注意点です。AutoBeans(http://code.google.com/p/google-web-toolkit/wiki)/AutoBean) - JSNIコードを書き出す必要はありません。必要なプロパティを定義するだけで、すべてのラッパーコードが正しく動作します。


まず、ほとんど役に立たない答え:

evalがそのように動作しません - JSを実行することを意図され、データにJSONをオンにしないで、とJSON表現(また、JS式)ISN」 tはJavascriptの法的声明です。コンテンツの周りに「(」と「)」を追加するのは、まったく効果がありますが、これはやや危険です。可能であればブラウザが正しいと判断するのが良いでしょう。あなたが解析エラーを期待しているが、可能性のある攻撃がそこから来ていないことが絶対に確かであれば - これはevalを呼び出すことになりますが、あなたはそれを維持する必要はありません)それをjsに正しく解析します。これをJSOに変換するには、parseメソッドの結果に.isObject().getJavaScriptObject()を呼び出します。次に、適切な値に.cast()を設定する必要があります。

+0

私はいくつかの場所でeval(...)を使用しないように同様のアドバイスを見て、私はこれをやっているので少し困惑していますGWTサイトの例から、私が理解できる限り、彼らはこのアプローチを推奨していますが、多くの人が悪いと言っています。 –

+0

例はかなり古いものです。 Eval自体は悪くありませんが、JavaScript言語の自然な(そして必要な)部分ですが、それにはリスクが伴います。不正なXMLファイルをアプリに読み込んでコードを実行するリスクがあるとすれば、人々はそれよりもはるかに少ないと思っており、それは本質的にevalのことです。 JSONParserの厳密な解析では、データを読み込む前にブラウザの検証機能を利用し、失敗した場合はコードで検証します。 –

+0

これでevalの問題は基本的にセキュリティriscですか?私はこのアプリで自分のサーバーからJSONを消費しています... –

関連する問題