Ошибка JSON BEGIN_OBJECT

Я экспериментирую с JSON и пытаюсь получить конкретную информацию ...

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;

public class Json {
    public static String toPrettyFormat(String jsonString)
    {
        JsonParser parser = new JsonParser();
        JsonObject json = parser.parse(jsonString).getAsJsonObject();

        Gson gson = new GsonBuilder().setPrettyPrinting().create();
        String prettyJson = gson.toJson(json);

        return prettyJson;
    }
    public static void main(String[] args) {
        try {
            URL url = new URL("https://api.coindesk.com/v1/bpi/currentprice/CAD.json");
            System.setProperty("http.agent", "Chrome");
            BufferedReader br = new BufferedReader(new InputStreamReader(url.openStream()));
            String str = "";
            String msg = "";
            while (null != (str = br.readLine())) {
                msg = msg + str;
                System.out.println("Test String 1 : "+toPrettyFormat(str));
            }
            System.out.println("Test String 2 : "+msg);
            Gson gson = new Gson();
            System.out.println("Test String 3 : "+str);
            JClass jClass = gson.fromJson(msg,JClass.class);
            System.out.println("Test String 4 : "+jClass.bpi);
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
}

JClass.java

public class JClass {
    public String time, disclaimer, bpi, CAD, USD, code, rate, description, rate_float;

    public JClass(String time, String disclaimer, String bpi, String USD, String CAD, String code, String rate, String description, String rate_float){
        this.time = time;
        this.disclaimer = disclaimer;
        this.bpi = bpi;
        this.USD = USD;
        this.CAD = CAD;
        this.code = code;
        this.rate = rate;
        this.description = description;
        this.rate_float = rate_float;
    }
}

Выход

Test String 1 : {
  "time": {
    "updated": "Apr 16, 2018 23:19:00 UTC",
    "updatedISO": "2018-04-16T23:19:00+00:00",
    "updateduk": "Apr 17, 2018 at 00:19 BST"
  },
  "disclaimer": "This data was produced from the CoinDesk Bitcoin Price Index (USD). Non-USD currency data converted using hourly conversion rate from openexchangerates.org",
  "bpi": {
    "USD": {
      "code": "USD",
      "rate": "8,041.1538",
      "description": "United States Dollar",
      "rate_float": 8041.1538
    },
    "CAD": {
      "code": "CAD",
      "rate": "10,107.3282",
      "description": "Canadian Dollar",
      "rate_float": 10107.3282
    }
  }
}
Test String 2 : {"time":{"updated":"Apr 16, 2018 23:19:00 UTC","updatedISO":"2018-04-16T23:19:00+00:00","updateduk":"Apr 17, 2018 at 00:19 BST"},"disclaimer":"This data was produced from the CoinDesk Bitcoin Price Index (USD). Non-USD currency data converted using hourly conversion rate from openexchangerates.org","bpi":{"USD":{"code":"USD","rate":"8,041.1538","description":"United States Dollar","rate_float":8041.1538},"CAD":{"code":"CAD","rate":"10,107.3282","description":"Canadian Dollar","rate_float":10107.3282}}}
Test String 3 : null
com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected a string but was BEGIN_OBJECT at line 1 column 10 path $.time
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:224)
    at com.google.gson.Gson.fromJson(Gson.java:888)
    at com.google.gson.Gson.fromJson(Gson.java:853)
    at com.google.gson.Gson.fromJson(Gson.java:802)
    at com.google.gson.Gson.fromJson(Gson.java:774)
    at wallettemplate.Json.main(Json.java:37)
Caused by: java.lang.IllegalStateException: Expected a string but was BEGIN_OBJECT at line 1 column 10 path $.time
    at com.google.gson.stream.JsonReader.nextString(JsonReader.java:825)
    at com.google.gson.internal.bind.TypeAdapters$16.read(TypeAdapters.java:401)
    at com.google.gson.internal.bind.TypeAdapters$16.read(TypeAdapters.java:389)
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.read(ReflectiveTypeAdapterFactory.java:129)
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:220)
    ... 5 more

Process finished with exit code 0

То, что я пытаюсь вытащить, - это курс валюты ... И я получаю сообщение об ошибке, которое я не совсем понимаю ...

Я все еще изучаю Java, поэтому мне может не хватать некоторых ключевых терминов или я не знаю, как правильно выполнить указанный желаемый результат.

Что вы ожидали напечатать?

shmosel 17.04.2018 02:40

Трассировки стека Java - очень полезный источник отладочной информации. Например, вы можете видеть, что JVM жалуется на какой-то код в строке 37 Json.java. Посмотрите, что делает эта строка, и убедитесь, что аргументы функции в этой строке действительны и верны.

Dan O 17.04.2018 02:42

JClass jClass = gson.fromJson (сообщение, JClass.class); это строка 37. Насколько я понимаю, он берет значение msg и копирует его в JClass.class для структуры.

BTCDude 17.04.2018 02:48
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
3
96
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Слишком медленно

public static String btcvalue(){
        String msg = "";
        try {
            URL url = new URL("https://api.coinmarketcap.com/v1/ticker/bitcoin/?convert=CAD");
            System.setProperty("http.agent", "Chrome");
            BufferedReader br = new BufferedReader(new InputStreamReader(url.openStream()));
            String str = "";
            while (null != (str = br.readLine())) {
                msg = msg + str;
            }
            String decodedText = msg;
            String[] parts = decodedText.split("price_cad");
            String[] amnt = parts[1].split(",");
            String[] finn = amnt[0].split(":");
            msg = finn[1].replace("\"", "");
        } catch (Exception ex) {
            ex.printStackTrace();
            msg = "10.000";
        }
        return msg;
    }

сделал работу. Он не использует JSON, просто находя строку.

Другие вопросы по теме