使用Gson / Java解析Alpha Vantage API

时间:2020-08-30 07:08:48

标签: java android json gson

我试图使用gson解析json数据。当我尝试使用GSON解析它时,总是会收到格式错误的JSON异常

com.google.gson.JsonSyntaxException: 
com.google.gson.stream.MalformedJsonException: Expected ':' at line 1 column 8 path $.Meta
        at com.google.gson.Gson.fromJson(Gson.java:947)
        at com.google.gson.Gson.fromJson(Gson.java:897)
        at com.google.gson.Gson.fromJson(Gson.java:846)
        at com.google.gson.Gson.fromJson(Gson.java:817)
com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected ':' at line 1 column 8 path $.Meta
        at com.google.gson.Gson.fromJson(Gson.java:947)
        at com.google.gson.Gson.fromJson(Gson.java:897)
        at com.google.gson.Gson.fromJson(Gson.java:846)
        at com.google.gson.Gson.fromJson(Gson.java:817)

以下是原始回复的摘要:

{
    "Meta Data": {
        "1. Information": "Intraday (5min) open, high, low, close prices and volume",
        "2. Symbol": "IBM",
        "3. Last Refreshed": "2020-08-28 17:00:00",
        "4. Interval": "5min",
        "5. Output Size": "Compact",
        "6. Time Zone": "US/Eastern"
    },
    "Time Series (5min)": {
        "2020-08-28 17:00:00": {
            "1. open": "125.3000",
            "2. high": "125.3000",
            "3. low": "125.3000",
            "4. close": "125.3000",
            "5. volume": "703"
        },
        "2020-08-28 16:55:00": {
            "1. open": "125.3500",
            "2. high": "125.3500",
            "3. low": "125.3000",
            "4. close": "125.3000",
            "5. volume": "672"
        },
        .....
        .....
        .....
    }
}

尽管我可以在没有gson的情况下解析json,但我只是想了解我在这里做错了什么。

这是崩溃所在的行:

TimeSeriesStocks tSeries = new Gson().fromJson(stringResponse, TimeSeriesStocks.class);

其中

stringResponse = response.body().toString()

response.body()是我从api获得的响应。我可以看到响应很好。

这是TimeSeriesStocks类:

public class TimeSeriesStocks {

    @SerializedName("Meta Data")
    public LinkedTreeMap<String, LinkedTreeMap<String, String>> metaData;

    @SerializedName("Time Series (5min)")
    public LinkedTreeMap<String, LinkedTreeMap<String, String>> timeSeriesMap;

}

我尝试将LinkedTreeMap添加为类型令牌,但出现了相同的异常。我也尝试使用普通的自定义对象,但是response.body()曾引发错误,指出服务器正在发送LinkedTreeMap作为响应。尽管问题看上去很简单,但我只是想知道我要去哪里。

1 个答案:

答案 0 :(得分:0)

问题出在我的服务层中,我从没注意过:

    @GET(endPoint)
    Call<TimeSeriesStocks> getTimeSeries();

    @GET(endPoint)
    Call<Object> getTimeSeriesAsString();
    

因此,当我们调用getWeatherForUsersCitiesString()并执行response.body()。toString()时,就会导致此问题,而json字符串并不是gson所期望的。我在此答案中发布的代码是实际问题所在,而不是json的实际解析中。