Я прочитал руководство пользователя 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.
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
Не смотря ни на что, что означает «Ожидаемая строка, но BEGIN_OBJECT» означает для вас? –
Отладить и показать, что 'json' вы возвращаете из' readJsonFromUrl() '. Кажется, это не действительный объект JSon. Или, по крайней мере, недействителен для вашего синтаксического анализатора. – Narmer
@SotiriosDelimanolis ничего, поэтому я прошу о помощи :) googling предполагает, что это потому, что моя строковая структура данных была неправильной, но другие примеры, похоже, используют мою настройку. –