不是JSON对象异常

时间:2015-06-19 14:25:07

标签: java json google-app-engine gson

我正在尝试通过Google GSON从Distance24 JSON输出获取JSON值。 但我无法弄清楚Exception的来源和位置(我正在使用Google AppEngine和Java)。

这是我发送并获取请求和响应的类。

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输出。所以我猜信息检索是有效的,即使它是在代码的错误部分。

在代码的相同try-catch-block(Distance24Client,方法“toDistance24”)中,它说,第30行出现错误,这是“toDistance24”方法的返回语句。

Output

(点击)

2 个答案:

答案 0 :(得分:1)

从我的浏览器运行http://www.distance24.org/route.json?stops=detroit|dublin给我

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

因此,距离是一个数组,而不是一个对象。 所以你的行:

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

错了。读取距离作为JsonArray。

答案 1 :(得分: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;
}