1

GWTサーバー側でJSONArray(org.JSON)を入力してから、クライアント側でオブジェクトを使用したいと思います。共有パッケージでJSONObject(または配列)を使用すると、ソースが見つからなかったという例外が発生します(サーバー上で動作している間)。したがって、クライアント側で使用したり、共有したりすることはできないと思います(グーグルにもかかわらず確認できませんでした)。

sharedはJSONObjectを使用しないため、JSNIはsharedで機能すると思いました。私はグーグル開発者とここスタックオーバーフローでGWTオーバーレイタイプを読み、共有パッケージでそれを作りました。ただし、JSNIであるため、サーバー上では使用できません。したがって、JSONObject.toString()を共有クラスに渡して、次のJSNIメソッドを呼び出すためのパラメーターとして使用しようとします。

public native UserOverlay getUser(String jsonObj) /*-{
    return jsonObj;
}-*/;

呼び出し:

UserOverlay user = getUser(jsonobj);

ただし、これにより、呼び出しの場所にUnsatisfiedLinkErrorが発生します。これは、私が知る限り、JSNIメソッドが見つからなかったことを意味し、共有パッケージがJSNIで機能しないことを意味します。

結論

クライアント、共有、サーバーの両方でJSONデータを使用する方法が必要です。その方法が異なる場合は、ある方法を別の方法に変換する方法が必要です。オーバーレイタイプからJSONObjectへの変換を処理するスレッドを見たことがありますが、その逆はありません。

4

2 に答える 2

2

CrockfordのJava用JSON実装を参照している場合、クライアントコードで使用できない理由は、最初にエミュレートする必要があるためです。あなたの目的のために、あなたは別のアプローチを使いたいと思うでしょう。

サーバーにJSONテキスト応答を返し(当然、HTTP経由で)、クライアントでXHRを介して要求し、応答を生の形式で使用するよりも、JSONはJavaScriptのリテラルオブジェクト表記のサブセットであるため、内部で透過的に使用できます。 JavaScriptコード。

このアプローチをGWTに実装するには、JSONをテキストとして返す(応答のライターに出力する)サーブレットを作成します。このサーブレットは、(XHRをラップする)を使用してクライアントから呼び出すことができRequestBuilder、オーバーレイタイプを使用して、コントラクトに従って各JSON応答をJava管理対象オブジェクトに変換できます。

Google Developerのドキュメントには、JSONの取得に関するチュートリアルがあり、それについてのみ説明しています。完全を期すために、ハイライトといくつかのスニペットを取り上げます。

  1. JSONを提供するサーブレットを作成する

    それに応じて、Webアプリケーションのデプロイメント記述子()を構成することを忘れないでくださいweb.xml

    public class JsonDataServlet extends HttpServlet {
    
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp)
                throws ServletException, IOException {
    
            PrintWriter out = resp.getWriter();
            out.println('{');
            // fill with JSON construct
            out.println('}');
            out.flush();
        }
    
    }
    
  2. 応答のインターフェースに従ってオーバーレイタイプを作成します

  3. JSON応答を具体的なものに変換するクライアント側ユーティリティを作成するJavaScriptObject

    チュートリアルではeval()、JSNIメソッド内での使用を提案していますが、サポートしているブラウザーJSONParser.parseStrict()で最初にJavaScriptを呼び出そうとするため、使用することをお勧めJSON.parse()します。

    public static UserOverlay asUserOverlay(String json) {
        JSONValue jsonVal = JSONParser.parseStrict(json);
        JSONObject jsonObj = jsonVal.isObject();
        UserOverlay userOverlay = (UserOverlay) jsonObj.getJavaScriptObject();
    }
    

    注:eval()とにかく実装を使用する場合は、json引数を括弧で囲む必要がありますeval('(' + json + ')')

  4. サーブレットを呼び出す

    RequestBuilder rb = new RequestBuilder(RequestBuilder.GET, GWT.getModuleBaseURL() + "path/to/servlet");
    rb.setCallback(new RequestCallback() {
    
        public void onError(Request request, Throwable exception) {
            // do something
        }
    
        public void onResponseReceived(Request request, Response response) {
            if (200 == response.getStatusCode()) {
                UserOverlay userOverlay = asUserOverlay(response.getText());
                // continue handling
            }
        }
    });
    rb.send();
    

GoogleWebToolkitのドキュメントに関する参照

于 2013-01-11T16:46:10.043 に答える
0

JSONを文字列として共有パッケージに保存しています。

org.JSONを使用して、サーバーでフェッチしたものを処理するために必要なことを実行し、クライアントでタイプをオーバーレイします。

私はaJsonArray.getJSONObject(i).toString();、JSON文字列をクライアントに送信するときに取得し、その文字列としてシリアル化可能に保存してから、クライアントでネイティブオーバーレイタイプ関数を呼び出すために使用します。チャームのように機能しますが、それが最善の方法かどうかはわかりません。それだけのようです。

于 2013-01-09T14:01:28.310 に答える