GWT с наложением типа для результатов поиска в Twitter - PullRequest
0 голосов
/ 17 января 2010

Я пытаюсь адаптировать учебник GWT для отправки запросов данных json на другой сайт, чтобы получать результаты поиска из твиттера (http://code.google.com/webtoolkit/doc/latest/tutorial/Xsite.html).. прийти как:

{"results":[
 {"text":"@twitterapi  http:\/\/tinyurl.com\/ctrefg",
 "to_user_id":396524,
 "to_user":"TwitterAPI",
 "from_user":"jkoum",
 "id":1478555574,   
 "from_user_id":1833773,
 ...

(http://apiwiki.twitter.com/Twitter-Search-API-Method%3A-search)

Таким образом, результатом является массив объектов некоторого вида, которые должны быть прочитаны программой Java. Я пытался написать оверлейный класс, но я не мог понять, как разбирать бит массива результатов, потому что я не совсем уверен, каким должен быть тип.

package com.google.twentyNumbers.client;

import com.google.gwt.core.client.JavaScriptObject;

public class TwitterResults extends JavaScriptObject {

    protected TwitterResults() { }

    public final native String getResults() /*-{ return this.results; }-*/;
    public final native String getToUser() /*-{ return this.to_user_id; }-*/;
}

Я пытался написать getResults() как return this.results[0].to_user_id; (просто чтобы посмотреть, смогу ли я прочитать одно из внутренних полей, но это не работает).

Для справки я пытаюсь прочитать данные следующим образом:

     /**
  * Cast JavaScriptObject as JsArray of StockData.
  */
 private final native JsArray<TwitterResults> asArrayOfResultData(JavaScriptObject jso) /*-{
    return jso;
 }-*/;


/**
  * Handle the response to the request for stock data from a remote server.
 */
 private void handleJsonResponse(JavaScriptObject tweets) {
    if (tweets == null) {
      displayError("Couldn't retrieve JSON");
      return;
    }

    JsArray<TwitterResults> results = asArrayOfResultData(tweets);
    displayError(results.get(0).getResults());

 }

Спасибо за любую помощь.

Редактировать 1/17/2010 :

Вот дополнительный код. window.alert, который я звоню выше [3], выдает соответствующее предупреждение, например, («На странице написано 787304

/**
* Cast JavaScriptObject to class TwitterResults
*/
private final native TwitterResults asArrayOfResultData(JavaScriptObject jso) /*-{
 return jso;
}-*/;


/**
   * Handle the response to the request for twitter data from a remote server.
   */
  private void handleJsonResponse(JavaScriptObject tweets) {
    /*if (tweets == null) {
      displayError("Couldn't retrieve JSON");
      return;
    }*/

    TwitterResults tw = asArrayOfResultData(tweets);

    displayError(tw.getMaxId()); // here it is 'null'
  }


/**
   * Make call to remote server.
   */
  public native static void getJson(int requestId, String url, TwentyNumbers handler) /*-{
   var callback = "callback" + requestId;

   // [1] Create a script element.
   var script = document.createElement("script");
   script.setAttribute("src", url + callback);
   script.setAttribute("type", "text/javascript");

   // [2] Define the callback function on the window object.
   window[callback] = function(jsonObj) {
    window.alert(jsonObj.max_id); // here it alerts the correct value
   // [3]
     handler.@com.google.twentyNumbers.client.TwentyNumbers::handleJsonResponse(Lcom/google/gwt/core/client/JavaScriptObject;)(jsonObj);
     window[callback + "done"] = true;
   }
...

/* File: TwitterResults.java */

package com.google.twentyNumbers.client;

import com.google.gwt.core.client.JavaScriptObject;

public class TwitterResults extends JavaScriptObject {

    protected TwitterResults() { }

    //public final native String getResults() /*-{ return this.results[0].to_user_id; }-*/;
    public final native String getSinceId() /*-{ return this.since_id; }-*/;
    public final native String getMaxId() /*-{ return this.max_id; }-*/;
    //public final native String getToUser() /*-{ return this.to_user_id; }-*/;
}

1 Ответ

0 голосов
/ 18 января 2010

Хорошо, понял.

Ключ должен быть ОЧЕНЬ осторожен в том, какого типа ваш java-код передается из объекта / javascript json. Если я не приведу this.max_id к строке, то он попытается передать назад класс javascript "number", с которым java не знает, что делать.

Вот рабочий класс оверлея (с дополнительным классом оверлея твита)

package com.google.twentyNumbers.client;

import com.google.gwt.core.client.JavaScriptObject;
import com.google.gwt.core.client.JsArray;

public class TwitterResults extends JavaScriptObject {

protected TwitterResults() { 

}
//public final String getMaxId() { return "500"; }
public final native JsArray<Tweet> getResults() /*-{ return this.results; }-*/;

public final native String getMaxId() /*-{ return ''+this.max_id; }-*/;
public final native String getRefreshUrl() /*-{ return this.refresh_url; }-*/;
public final native String getNextPage() /*-{ return this.next_page; }-*/;

}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...