2015-06-19 62 views
0

我想通過谷歌GSON從Distance24 JSON輸出獲取JSON值。 但我無法弄清楚異常來自何處(我正在使用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一個String()輸出。所以我猜測信息檢索工作,即使它在代碼的錯誤部分。

加上代碼(Distance24Client,方法「toDistance24」)的同一個try-catch-block中,它說30行中出現了錯誤,這是「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; 
}