Я экспериментирую с 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, поэтому мне может не хватать некоторых ключевых терминов или я не знаю, как правильно выполнить указанный желаемый результат.
Трассировки стека Java - очень полезный источник отладочной информации. Например, вы можете видеть, что JVM жалуется на какой-то код в строке 37 Json.java. Посмотрите, что делает эта строка, и убедитесь, что аргументы функции в этой строке действительны и верны.
JClass jClass = gson.fromJson (сообщение, JClass.class); это строка 37. Насколько я понимаю, он берет значение msg и копирует его в JClass.class для структуры.




Слишком медленно
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, просто находя строку.
Что вы ожидали напечатать?