2014-09-24 3 views
0

Я прочитал руководство пользователя GSon и рассмотрел некоторые вопросы здесь, но я действительно пытаюсь понять, почему я получаю ошибку, пытаясь сделать объект Java с помощью GSonGson to Plain Старый объект Java (POJO)

public class TestJSON extends ActionBarActivity { 
    private Location start; 
    private String length; 
    private String url = "http://maps.googleapis.com/maps/api/directions/json?origin="; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_test_json); 

     // dummyprovider is provided by google to let me set a location. 
     start = new Location("dummyprovider"); 
     start.setLatitude(51.5033630); 
     start.setLongitude(-0.1276250); 

     // Recieve an android warning if you run a retrieval task (such as JSON) 
     // in the main thread). 
     try { 
      System.out.println("printing Json"); 

      Thread thread = new Thread(new Runnable() { 
       @Override 
       public void run() { 
        try { 

         toJava(readJsonFromUrl(urlBuilder())); 
        } catch (Exception e) { 
         e.printStackTrace(); 
        } 
       } 
      }); 
      thread.start(); 

     } catch (Exception e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.test_json, menu); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     // Handle action bar item clicks here. The action bar will 
     // automatically handle clicks on the Home/Up button, so long 
     // as you specify a parent activity in AndroidManifest.xml. 
     int id = item.getItemId(); 
     if (id == R.id.action_settings) { 
      return true; 
     } 
     return super.onOptionsItemSelected(item); 
    } 

    // I think in future I will call this function a ton of times and send it 
    // some locations as waypoints for it to try and get closer to the 
    // distances. 
    private String urlBuilder() { 
     String newUrl = url + start.getLatitude() + "," + start.getLongitude() 
       + "&destination=51.5042178,23"; 

     return newUrl; 
    } 

    // Builds the string for JSON. 
    private String readAll(Reader rd) throws IOException { 
     StringBuilder sb = new StringBuilder(); 
     int cp; 
     while ((cp = rd.read()) != -1) { 
      sb.append((char) cp); 
     } 
     return sb.toString(); 
    } 

    // Take an input url and reads from it using the url above. We then put it 
    // into a JSON object. 
    private JSONObject readJsonFromUrl(String url) throws IOException, 
      JSONException { 
     InputStream is = new URL(url).openStream(); 
     try { 
      BufferedReader rd = new BufferedReader(new InputStreamReader(is, 
        Charset.forName("UTF-8"))); 
      String jsonText = readAll(rd); 
      JSONObject json = new JSONObject(jsonText); 

      return json; 
     } finally { 
      is.close(); 
     } 
    } 

    private void toJava(JSONObject obj) throws Exception { 
     Gson gson = new Gson(); 
     MapsRoute m = gson.fromJson(readJsonFromUrl(urlBuilder()).toString(), 
       MapsRoute.class); 
     System.out.println(m); 

    } 

    } 

MapsRoute.java

public class MapsRoute { 

     @SerializedName("routes") 
     public List<String> routes; 

     @SerializedName("copyrights") 
     public String copyrights; 

     @SerializedName("legs") 
     public List<String> legs; 

     @SerializedName("steps") 
     public List<String> steps; 

    } 

Это трассировки стека

09-24 19:22:47.367: W/System.err(1720): com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected a string but was BEGIN_OBJECT at line 1 column 27 
09-24 19:22:47.367: W/System.err(1720):  at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:176) 
09-24 19:22:47.367: W/System.err(1720):  at com.google.gson.Gson.fromJson(Gson.java:803) 
09-24 19:22:47.367: W/System.err(1720):  at com.google.gson.Gson.fromJson(Gson.java:768) 
09-24 19:22:47.367: W/System.err(1720):  at com.google.gson.Gson.fromJson(Gson.java:717) 
09-24 19:22:47.367: W/System.err(1720):  at com.google.gson.Gson.fromJson(Gson.java:689) 
09-24 19:22:47.367: W/System.err(1720):  at boyle.matt.runrouter.TestJSON.toJava(TestJSON.java:119) 
09-24 19:22:47.367: W/System.err(1720):  at boyle.matt.runrouter.TestJSON.access$2(TestJSON.java:117) 
09-24 19:22:47.371: W/System.err(1720):  at boyle.matt.runrouter.TestJSON$1.run(TestJSON.java:47) 
09-24 19:22:47.371: W/System.err(1720):  at java.lang.Thread.run(Thread.java:856) 
09-24 19:22:47.371: W/System.err(1720): Caused by: java.lang.IllegalStateException: Expected a string but was BEGIN_OBJECT at line 1 column 27 
09-24 19:22:47.371: W/System.err(1720):  at com.google.gson.stream.JsonReader.nextString(JsonReader.java:821) 
09-24 19:22:47.371: W/System.err(1720):  at com.google.gson.internal.bind.TypeAdapters$13.read(TypeAdapters.java:358) 
09-24 19:22:47.371: W/System.err(1720):  at com.google.gson.internal.bind.TypeAdapters$13.read(TypeAdapters.java:346) 
09-24 19:22:47.371: W/System.err(1720):  at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.read(TypeAdapterRuntimeTypeWrapper.java:40) 
09-24 19:22:47.371: W/System.err(1720):  at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:81) 
09-24 19:22:47.371: W/System.err(1720):  at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:60) 
09-24 19:22:47.371: W/System.err(1720):  at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.read(ReflectiveTypeAdapterFactory.java:93) 
09-24 19:22:47.371: W/System.err(1720):  at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:172) 
09-24 19:22:47.371: W/System.err(1720):  ... 8 more 

Я уверен, что я недопонимаю что-то простое и очень ценю руководство.

Это URL-адрес googlemaps, который пытается разобрать, я получаю его успешно, поскольку я могу его удалить из моего метода readfromurl.

http://maps.googleapis.com/maps/api/directions/json?origin=51.5033630,-0.1276250&destination=51.5042178,23

EDIT: Это выход при вызове readsFromUrl (urlBuilder());

09-24 19: 57: 03,879 I/System.out (4068): { "Статус": "ОК", "маршруты": [{ "waypoint_order": резюме [], " ":" A2 "," bounds ": {" southwest ": {" lng ": - 0.1262498," lat ": 50.91870669999999}, " северо-восток ": {" lng ": 23.0020594," lat ": 52.4304362}}, «ноги»: [{«продолжительность»: {«значение»: 63803, «текст»: «17 часов 43 минуты»}, «расстояние»: {«значение»: 1825694, «текст»: «1,826 км», }, "end_location": { "LNG": 23.0020594, "ш": 51,50389209999999}, "start_address": "70 Уайтхолл, Лондон

SW1A 2AS, Великобритания", "end_address": "Orzechów-Kolonia 2, 21-109 Orzechów-Kolonia, Poland "," start_location ": {" lng ": - 0.1262498," lat ": 51.5034032}," via_waypoint ": []," steps ": [{" html_instructions ":" Head north </b> на Дворце Уайтхолл/Уайтхолл/A3212 </b> по направлению к Конный гвардейский пр. </b> "," duration ": {" value ": 17," text ":" 1 min "}," distance ": {" value ": 157," text ":" 0.2 km "}," end_location ": {" lng ": - 0.1265332," lat ": 51.50479920000001}," polyline ": {" points ":" ggjyH tW]@cADYD[[email protected]"},"travel_mode":"DRIVING","start_location":{"lng":-0.1262498,"lat":51.5034032}},{"html_instructions":"Turn <b>right<\/b> onto <b>Horse Guards Ave<\/b>","duration":{"value":53,"text":"1 min"},"distance":{"value":242,"text":"0.2 km"},"end_location":{"lng":-0.1231268,"lat":51.50464890000001},"polyline":{"points":"_pjyHxuWC][email protected][email protected][email protected] @wEPeBBY "}," start_location ": {" lng ": - 0.1265332," lat ": 51.50479920000001}," maneuver ":" turn-right "," travel_mode ":" DRIVING "}, {" html_instructions ":" Поворот правый </b> на Викторию Набережная/A3211 </b> "," duration ": {" value ": 49," text ":" 1 min "}," distance ": {" value ": 389," text ":" 0.4 km "}," end_location ": {" lng ": - 0.1239744," lat ": 51.5011942}," polyline ": {"points": "aojyHp [email protected] En @ ~ @ F @? b @ Bl @@"}, "start_location": {"lng": - 0.1231268, "lat": 51.50464890000001}, "маневр": "повернуть направо », "travel_mode": "ВОДИТЕЛЬСКИЕ"}, { "html_instructions": "Turn влево </B> на Вестминстерский мост Rd/A302 </B> Оставляя платную зону </дел> Ввод платных зоны </DIV>" , "duration": {"value": 62, "text": "1 min"}, "distance": {"value": 507, "text": "0.5 km"}, "end_location": { "LNG": - 0.1170572, "ш": +51,50053550000001}, "ломаная": { "точки": "myiyHxeW @ ABABCB DADCBABCBC @ CBEBI K @ E @ G @ ВГБ @@} @@ Qa @ д @ DkFFkF?? KFuAFgAEYC @ г @@ гА _ @ O @ U @ Q @ KBMBGBGP [FM "}," стартовая_позиция ": {" LNG ": - 0.1239744," [Ай @?]? LAT ": 51.5011942}, «маневр»: «поворот-левый», «travel_mode»: «ДВИЖЕНИЕ»}, {«html_instructions»: «Незначительное осталось </b>, чтобы остаться на Вестминстерском мосту Rd/A302 </b> Оставшиеся потери зона </div> "," duration ": {" value ": 4," text ":" 1 min "}," distance ": {" value ": 26," text ":" 26 m "} "end_location": { "LNG": - 0.1167459, "ш": 51.5004276}, "ломаная": { "точки": "kuiyHrzUFIBEBG @ G @ G @ G M?"}, "стартовая_позиция": { "LNG" : -0.1170572, «lat»: 51.50053550000001}, «маневр»: «turn-light-left», «travel_mode»: «DRIVING»}, {«html_instructions»: «Поверните слева </b>, чтобы остаться на Вестминстерском мосту Rd/A302 </b> "," duration ": {" value ": 4," text ":" 1 min "}," distance ": {" value ": 23," text ":" 23 м "}," end_loca Тион ": {" LNG ": - 0.1165272," ш ": 51.5005834}," ломаная ": {" точки ":" utiyHtxUIQIMIK "}," стартовая_позиция ": {" LNG ": - 0.1167459," ш ": 51.5004276} , «маневр»: «поворот-левый», «travel_mode»: «DRIVING»}, {«html_instructions»: «Незначительный правый </b> для пребывания на Вестминстерском мосту Rd/A302 </b>", "duration ": {" value ": 10," text ":" 1 min "}," distance ": {" value ": 52," text ":" 52 m "}," end_location ": {" lng " : -0,1158714, "ш": 51,5007879}, "ломаная": { "точки": "suiyHhwUEa @ GUGQQc @ AE G G?"}, "START_LOCATION": { "LNG": - 0.1165272 "LAT": 51.5005834 }, «маневр»: «turn-small-right», «travel_mode»: «DRIVING»}, {«html_instructions»: «Поверните справа </b>, чтобы остаться на Вестминстерском мосту Rd/A302 </b> Продолжить следовать за Вестминстерским мостом Rd </div> Ente Число звонков зона </div> "," duration ": {" value ": 93," text ":" 2 mins "}," distance ": {" value ": 848," text ":" 0.8 км "}," end_location ": {" LNG ": - 0.1051152," ш ": 51,49874029999999}," ломаная ": {" точки ":"} viyHdsU @ EBG @ E @ CBEBCFGNQBMFMLYZm @ B @ O @ d @ O @ FUDKd @ oAXe @ Vs @ ~ @ Icn [DKFKDGBGJYb @ _B \ mBRiAHa @ BO @ я? G @ E? G @ ВБО @@] CMAOIyAAo @? K? G? EGyAAe @ EoAIwCKyCEoAAa @ GiBIc @ CQCW "}," start_location» : { "LNG": - 0.1158714, "ш": 51.5007879}, "маневр": "под право", "travel_mode": "DR

+0

Не смотря ни на что, что означает «Ожидаемая строка, но BEGIN_OBJECT» означает для вас? –

+0

Отладить и показать, что 'json' вы возвращаете из' readJsonFromUrl() '. Кажется, это не действительный объект JSon. Или, по крайней мере, недействителен для вашего синтаксического анализатора. – Narmer

+0

@SotiriosDelimanolis ничего, поэтому я прошу о помощи :) googling предполагает, что это потому, что моя строковая структура данных была неправильной, но другие примеры, похоже, используют мою настройку. –

ответ

0

Эй отображение объекта Java с JSON не является правильным.

пример: маршруты имеют границы, ноги, авторские права, шаги, а не способ, которым он был отображен в приведенном выше коде.

+0

Пожалуйста, не могли бы вы дать краткое описание правильного способа сделать это? –

+0

Определить класс маршрута, связанный класс, класс Step, класс Leg. Класс Route имеет объект класса Bound, класс Step, CopyRight типа String, объект класса Leg. Теперь вы используете это как схему. – pd30

+0

ok, поэтому MapsRoute должен иметь открытый список , а затем маршрут должен иметь список для каждого из других разделов? –