0

I'm trying to fetch a JSON string to an object array in GWT.

My JSON string is here: https://api.guildwars2.com/v1/wvw/matches.json

{"wvw_matches":[{"wvw_match_id":"2-6","red_world_id":2102,"blue_world_id":2105,"green_world_id":2205,"start_time":"2014-08-22T18:00:00Z","end_time":"2014-08-29T18:00:00Z"},
{"wvw_match_id":"1-2","red_world_id":1005,"blue_world_id":1009,"green_world_id":1016,"start_time":"2014-08-23T01:00:00Z","end_time":"2014-08-30T01:00:00Z"},
{"wvw_match_id":"1-6","red_world_id":1022,"blue_world_id":1012,"green_world_id":1018,"start_time":"2014-08-23T01:00:00Z","end_time":"2014-08-30T01:00:00Z"},
{"wvw_match_id":"2-4","red_world_id":2101,"blue_world_id":2014,"green_world_id":2204,"start_time":"2014-08-22T18:00:00Z","end_time":"2014-08-29T18:00:00Z"},
{"wvw_match_id":"2-9","red_world_id":2011,"blue_world_id":2008,"green_world_id":2006,"start_time":"2014-08-22T18:00:00Z","end_time":"2014-08-29T18:00:00Z"},
{"wvw_match_id":"1-5","red_world_id":1007,"blue_world_id":1002,"green_world_id":1004,"start_time":"2014-08-23T01:00:00Z","end_time":"2014-08-30T01:00:00Z"},
{"wvw_match_id":"2-3","red_world_id":2103,"blue_world_id":2012,"green_world_id":2003,"start_time":"2014-08-22T18:00:00Z","end_time":"2014-08-29T18:00:00Z"},
{"wvw_match_id":"2-1","red_world_id":2202,"blue_world_id":2002,"green_world_id":2010,"start_time":"2014-08-22T18:00:00Z","end_time":"2014-08-29T18:00:00Z"},
{"wvw_match_id":"1-1","red_world_id":1019,"blue_world_id":1017,"green_world_id":1008,"start_time":"2014-08-23T01:00:00Z","end_time":"2014-08-30T01:00:00Z"},
{"wvw_match_id":"2-5","red_world_id":2104,"blue_world_id":2301,"green_world_id":2013,"start_time":"2014-08-22T18:00:00Z","end_time":"2014-08-29T18:00:00Z"},
{"wvw_match_id":"2-8","red_world_id":2004,"blue_world_id":2001,"green_world_id":2009,"start_time":"2014-08-22T18:00:00Z","end_time":"2014-08-29T18:00:00Z"},
{"wvw_match_id":"2-7","red_world_id":2005,"blue_world_id":2207,"green_world_id":2206,"start_time":"2014-08-22T18:00:00Z","end_time":"2014-08-29T18:00:00Z"},
{"wvw_match_id":"1-3","red_world_id":1021,"blue_world_id":1003,"green_world_id":1014,"start_time":"2014-08-23T01:00:00Z","end_time":"2014-08-30T01:00:00Z"},
{"wvw_match_id":"2-2","red_world_id":2007,"blue_world_id":2203,"green_world_id":2201,"start_time":"2014-08-22T18:00:00Z","end_time":"2014-08-29T18:00:00Z"},
{"wvw_match_id":"1-4","red_world_id":1015,"blue_world_id":1023,"green_world_id":1011,"start_time":"2014-08-23T01:00:00Z","end_time":"2014-08-30T01:00:00Z"},
{"wvw_match_id":"1-7","red_world_id":1006,"blue_world_id":1001,"green_world_id":1010,"start_time":"2014-08-23T01:00:00Z","end_time":"2014-08-30T01:00:00Z"},
{"wvw_match_id":"1-8","red_world_id":1024,"blue_world_id":1020,"green_world_id":1013,"start_time":"2014-08-23T01:00:00Z","end_time":"2014-08-30T01:00:00Z"}]}

My code:

try {
      Request request = builder.sendRequest(null, new RequestCallback() {


        @Override
        public void onResponseReceived(Request request, Response response)
        {
             if (200 == response.getStatusCode()) {
                 Window.alert(response.getText());
                    updateTable(JsonUtils.<JsArray<JSONreceiverGW>>safeEval(response.getText()));
             }else{
                 Window.alert("Couldn't retrieve JSON " + response.getStatusText());

             }

        }

        @Override
        public void onError(Request request, Throwable exception)
        {
             Window.alert("Couldn't retrieve JSON");

        }
      });
    } catch (RequestException e) {
         Window.alert("Couldn't retrieve JSON");
    }

     private void updateTable(JsArray<JSONreceiverGW> jsArray) {

      for (int i = 0; i < jsArray.length(); i++) {
          Window.alert(jsArray.get(i).getmatchID());
        }


 }

I get the error:

Something other than an int was returned from JSNI method '@com.google.gwt.core.client.JsArray::length()': JS value of type undefined, expected int

1 Answer 1

2

What you receive is not an array, it's an object with a property whose value is an array (and that object does not have a length property, hence the undefined). You need a JSO for the container object:

public class JSONreceiverGWContainer extends JavaScriptObject {
  protected JSONreceiverGWContainer() {}

  public final JsArray<JSONreceiverGW> getWvwMatches() /*-{ return this.wvw_matches; }-*/;
}

then you'll do something like the following (split on two line for readability):

JSONreceiverGWContainer container = JsonUtils.safeEval(response.getText());
updateTable(container.getWvwMatches());
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.