2015-06-19 4 views
0

Я пытаюсь получить значения JSON от Distance24 Выход JSON через Google GSON. Но я не могу понять, что и откуда происходит Исключение (я использую Google AppEngine с Java).Не исключение объекта JSON

Вот класс, из которого я отправляю и получаю запрос и ответ.

package de.tum.in.eist.distance; 

import java.io.IOException; 

import javax.inject.Inject; 
import java.net.URL; 

import com.google.appengine.api.urlfetch.HTTPResponse; 
import com.google.appengine.api.urlfetch.URLFetchService; 
import com.google.gson.JsonObject; 

import de.tum.in.eist.JsonHelper; 
import de.tum.in.eist.URLFetchServiceHelper; 

public class Distance24Client { 

    private final URLFetchService service; 

    @Inject 
    public Distance24Client(URLFetchService service) { 
     this.service = service; 
    } 

    public Distance24 getDistanceAPI(String source, String destination) throws IOException { 
     URL url = new URL("http://www.distance24.org/route.json?stops=" + source + "|" + destination); 
     HTTPResponse response = service.fetch(url); 
     String jsonString = URLFetchServiceHelper.toString(response); 
     try { 
      JsonObject json = JsonHelper.parse(jsonString); 
      return toDistance24(json); 
     } catch (Exception e) { 
      throw new IOException("Error ocurred in getDistanceAPI(): " + e.getMessage()); 
     } 
    } 

    private Distance24 toDistance24(JsonObject response) { 
     if (!(response.get("stops").getAsJsonObject().getAsJsonArray().size() != 0)) { 
      throw new IllegalArgumentException("No Status set from Distance24 API"); 
     } else { 
      JsonObject distances = response.get("distances").getAsJsonObject(); 
      return new Distance24(distances); 
     } 
    } 

} 

И вот Distance24 Объект:

package de.tum.in.eist.distance; 

import com.google.gson.JsonArray; 
import com.google.gson.JsonObject; 

public class Distance24 { 

    private int[] distances; 
    private int totalDistance; 
    private Double sourceLat; 
    private Double sourceLon; 
    private Double destLat; 
    private Double destLong; 

    public Distance24(JsonObject distances) { 
     this.setDistances(getIntArray(distances)); 
     this.setTotalDistance(getSum(this.distances)); 
     this.setSourceLat(distances.get("stops").getAsJsonObject().getAsJsonArray().get(0).getAsJsonObject().get("latitude").getAsDouble()); 
     this.setSourceLon(distances.get("stops").getAsJsonObject().getAsJsonArray().get(0).getAsJsonObject().get("longitude").getAsDouble()); 
     this.setDestLat(distances.get("stops").getAsJsonObject().getAsJsonArray().get(1).getAsJsonObject().get("latitude").getAsDouble()); 
     this.setDestLong(distances.get("stops").getAsJsonObject().getAsJsonArray().get(1).getAsJsonObject().get("longitude").getAsDouble()); 
    } 

    private int[] getIntArray(JsonObject array) { 
     JsonArray distances = array.getAsJsonArray(); 
     int[] result = new int[distances.size()]; 
     for(int i = 0; i < distances.size(); i++) { 
      result[i] = distances.get(i).getAsInt(); 
     } 

     return result; 
    } 

    private int getSum(int[] array) { 
     int sum = 0; 
     for(int element : array) { 
      sum += element; 
     } 

     return sum; 
    } 

    private void setDistances(int[] distances) { 
     this.distances = distances;  
    } 

    public int getTotalDistance() { 
     return totalDistance; 
    } 

    public void setTotalDistance(int totalDistance) { 
     this.totalDistance = totalDistance; 
    } 

    public Double getSourceLat() { 
     return sourceLat; 
    } 

    public void setSourceLat(Double sourceLat) { 
     this.sourceLat = sourceLat; 
    } 

    public Double getSourceLon() { 
     return sourceLon; 
    } 

    public void setSourceLon(Double sourceLon) { 
     this.sourceLon = sourceLon; 
    } 

    public Double getDestLat() { 
     return destLat; 
    } 

    public void setDestLat(Double destLat) { 
     this.destLat = destLat; 
    } 

    public Double getDestLong() { 
     return destLong; 
    } 

    public void setDestLong(Double destLong) { 
     this.destLong = destLong; 
    } 

} 

В результате я получаю весь объект JSON в качестве выходной строки для e.getMessage(). Поэтому я думаю, что поиск информации работает, даже если он находится в неправильной части кода.

Плюс в том же блоке try-catch кода (Distance24Client, method "toDistance24"), говорится в сообщении об ошибке в строке 30, которая является оператором return метода toDistance24.

Output

(кликабельны)

+0

Что такое JSON вы получаете? Вы уверены, что ключ «расстояния» указывает на объект JSON, а не на массив, скажем? –

+0

@JPMoresmau Я добавил небольшой снимок экрана с вывода выше. Ошибка, указанная здесь, должна быть данными JSON, которую я хочу получить, но она застряла в этой точке, исключение выбрасывает данные JSON в виде строки. – CRoemheld

ответ

1

Запуск http://www.distance24.org/route.json?stops=detroit|dublin из браузера дает мне

{"stops":[{"region":"Michigan ... 
"distances":[5581]} 

Так расстояния является массивом, а не объект. Так что ваша линия:

JsonObject distances = response.get("distances").getAsJsonObject(); 

неправильно. Прочитайте расстояния как JsonArray.

+0

Изменено все, что касается «расстояний» до JsonArray, все тот же выход. – CRoemheld

+0

Получил! Мой плохой, забыл отменить восстановление (сначала JsonArray, затем JsonObject). Большое спасибо! @JPMoresmau – CRoemheld

0

Создать метод для обработки массива или нет-массив

public static JsonElement toJsonElement(String jsonString) { 
    JsonParser parser = new JsonParser(); 
    JsonElement jsonElement = parser.parse(jsonString); 

    JsonElement result = null; 
    if (jsonElement instanceof JsonObject) { 
     result = jsonElement.getAsJsonObject(); 
    } else if (jsonElement instanceof JsonArray) { 
     result = jsonElement.getAsJsonArray(); 
    } else { 
     throw new IllegalArgumentException(jsonString + " is not valid JSON stirng"); 
    } 

    return result; 
} 
Смежные вопросы