Путаница Gson, ожидался BEGIN_ARRAY, но была ошибка строки, полученная из вызовов REST с URL - PullRequest
0 голосов
/ 06 августа 2020

Я получаю данные из службы фондовой биржи, используя вызовы 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. Надеюсь, вы, милые люди, сможете диагностировать мою проблему, не запуская ее самостоятельно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...