Я получаю данные из службы фондовой биржи, используя вызовы REST из URL.
Вот как их JSON выглядит с веб-сайта IEX API при запросе с помощью GET "Symbol":
[
{
"symbol": "A",
"name": "Agilent Technologies Inc.",
"date": "2019-03-07",
"type": "cs",
"iexId": "IEX_46574843354B2D52",
"region": "US",
"currency": "USD",
"isEnabled": true,
"figi": "BBG000C2V3D6",
"cik": "1090872",
},
{
"symbol": "AA",
"name": "Alcoa Corp.",
"date": "2019-03-07",
"type": "cs",
"iexId": "IEX_4238333734532D52",
"region": "US",
"currency": "USD",
"isEnabled": true,
"figi": "BBG00B3T3HD3",
"cik": "1675149",
}
]
Вот мой класс Stock:
import java.util.Date;
public class Stock {
String symbol;
String name;
String date;
String type;
String iexId;
String region;
String currency;
Boolean isEnabled;
String figi;
String cik;
public Stock() {
}
public Stock(String symbol, String name, String date, String type, String iexId,
String region,
String currency,
Boolean isEnabled,
String figi,
String cik) {
this.symbol = symbol;
this.name = name;
this.date = date;
this.type = type;
this.iexId = iexId;
this.region = region;
this.currency = currency;
this.isEnabled = isEnabled;
this.figi = figi;
this.cik = cik;
}
}
Вот мой основной код:
import java.awt.Window.Type;
import java.io.IOException;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.util.ArrayList;
import java.util.List;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.reflect.TypeToken;
public class main {
private static final String POSTS_API_URL = "https://sandbox.iexapis.com/stable/ref-data/symbols?token=Tsk_blahblahblah";
public static void main(String[] args) throws IOException, InterruptedException {
// TODO Auto-generated method stub
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.GET()
.uri(URI.create(POSTS_API_URL))
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
String string = response.toString();
Gson gson = new Gson();
java.lang.reflect.Type stockListType = new TypeToken<ArrayList<Stock>>() {}.getType();
List<Stock> stockList = gson.fromJson(string, stockListType);
System.out.println(stockList);
}
}
Когда я запускаю его, я получаю в консоли следующее:
Exception in thread "main" com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_ARRAY but was STRING at line 1 column 1 path $
at com.google.gson.Gson.fromJson(Gson.java:944)
at com.google.gson.Gson.fromJson(Gson.java:897)
at com.google.gson.Gson.fromJson(Gson.java:846)
at main.main(main.java:41)
Caused by: java.lang.IllegalStateException: Expected BEGIN_ARRAY but was STRING at line 1 column 1 path $
at com.google.gson.stream.JsonReader.beginArray(JsonReader.java:351)
at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:80)
at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:61)
at com.google.gson.Gson.fromJson(Gson.java:932)
... 3 more
Я понимаю, что Gson ожидает BEGIN_ARRAY, но я даю ему строку. Однако мои знания о Gson и JSON чрезвычайно элементарны, и я не уверен, как разрешить свой код. Я искал здесь и нашел несколько хороших вопросов / ответов, связанных с этим конкретным исключением. У меня глупый момент, и я все еще не могу его понять.
Кроме того, я знаю, что мне следует использовать что-то вроде Джерси вместо того HttpClient, который я использую. Я намерен усовершенствовать свой код, как только он будет делать то, что я хочу.
Спасибо за любой свет, который вы могли пролить на меня.
Примечание: бла-бла-бла в в URL-адресе токен моей платной учетной записи будет go. Надеюсь, вы, милые люди, сможете диагностировать мою проблему, не запуская ее самостоятельно.