使用 Gson 在 JAVA 中解析 JSON
Parsing JSON in JAVA usng Gson
所以我正在尝试使用 Gson 解析 Java 中的 JSON 对象。
我正在尝试从网站上使用 API。
这是自动收报机:
https://api.coinmarketcap.com/v1/ticker/bitcoin/
JSON 看起来像这样:
[
{
"id": "bitcoin",
"name": "Bitcoin",
"symbol": "BTC",
"rank": "1",
"price_usd": "3591.95",
"price_btc": "1.0",
"24h_volume_usd": "3263990000.0",
"market_cap_usd": "59516499433.0",
"available_supply": "16569412.0",
"total_supply": "16569412.0",
"percent_change_1h": "1.02",
"percent_change_24h": "15.59",
"percent_change_7d": "-15.18",
"last_updated": "1505563475"
}
]
我正在使用 Jersey 来使用 API,我想将这个 JSON 转换成一个对象。
这是应该通过解析 JSON:
构建的对象
public class CryptoCurrency {
String id;
String name;
String symbol;
String rank;
String price_usd;
String price_btc;
String market_cap_usd;
String available_supply;
String total_supply;
String percent_change_1h;
String percent_change_24h;
String percent_change_7d;
String last_updated;
}
这是我的代码:
public class CoinMarketCap {
public static void main(String[] args) {
Client client = ClientBuilder.newClient();
WebTarget target = client.target("https://api.coinmarketcap.com/v1/ticker/bitcoin/");
String bitoinDeteils = target.request(MediaType.TEXT_XML).get(String.class);
Gson gson = new GsonBuilder().create();
CryptoCurrency bitcoin = gson.fromJson(bitoinDeteils, CryptoCurrency.class);
System.out.println(bitcoin);
}
}
我收到一个错误
Exception in thread "main" com.google.gson.JsonSyntaxException:
java.lang.IllegalStateException: Expected BEGIN_OBJECT but was
BEGIN_ARRAY at line 1 column 2 path $ at
com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:224)
at com.google.gson.Gson.fromJson(Gson.java:887) at
com.google.gson.Gson.fromJson(Gson.java:852) at
com.google.gson.Gson.fromJson(Gson.java:801) at
com.google.gson.Gson.fromJson(Gson.java:773) at
com.randomizer.CoinMarketCap.main(CoinMarketCap.java:21) Caused by:
java.lang.IllegalStateException: Expected BEGIN_OBJECT but was
BEGIN_ARRAY at line 1 column 2 path $ at
com.google.gson.stream.JsonReader.beginObject(JsonReader.java:385) at
com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:213)
... 5 more
你看到我的代码有什么问题吗?谢谢。
错误信息说JSON字符串包含一个数组("was BEGIN_ARRAY"),但是你尝试将它解析为一个对象("Expected BEGIN_OBJECT").
正如我们在您提供的JSON字符串中看到的那样,它确实是一个数组,您感兴趣的对象被包裹在方括号中([ ... ]
)。
尝试将其解析为 List<CryptoCurrency>
然后:
Type listType = new TypeToken<ArrayList<CryptoCurrency>>(){}.getType();
List<CryptoCurrency> list = new Gson().fromJson(jsonString, listType);
(Type
是 java.lang.reflect.Type
。)
所以我正在尝试使用 Gson 解析 Java 中的 JSON 对象。 我正在尝试从网站上使用 API。 这是自动收报机: https://api.coinmarketcap.com/v1/ticker/bitcoin/
JSON 看起来像这样:
[
{
"id": "bitcoin",
"name": "Bitcoin",
"symbol": "BTC",
"rank": "1",
"price_usd": "3591.95",
"price_btc": "1.0",
"24h_volume_usd": "3263990000.0",
"market_cap_usd": "59516499433.0",
"available_supply": "16569412.0",
"total_supply": "16569412.0",
"percent_change_1h": "1.02",
"percent_change_24h": "15.59",
"percent_change_7d": "-15.18",
"last_updated": "1505563475"
}
]
我正在使用 Jersey 来使用 API,我想将这个 JSON 转换成一个对象。
这是应该通过解析 JSON:
构建的对象public class CryptoCurrency {
String id;
String name;
String symbol;
String rank;
String price_usd;
String price_btc;
String market_cap_usd;
String available_supply;
String total_supply;
String percent_change_1h;
String percent_change_24h;
String percent_change_7d;
String last_updated;
}
这是我的代码:
public class CoinMarketCap {
public static void main(String[] args) {
Client client = ClientBuilder.newClient();
WebTarget target = client.target("https://api.coinmarketcap.com/v1/ticker/bitcoin/");
String bitoinDeteils = target.request(MediaType.TEXT_XML).get(String.class);
Gson gson = new GsonBuilder().create();
CryptoCurrency bitcoin = gson.fromJson(bitoinDeteils, CryptoCurrency.class);
System.out.println(bitcoin);
}
}
我收到一个错误
Exception in thread "main" com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 2 path $ at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:224) at com.google.gson.Gson.fromJson(Gson.java:887) at com.google.gson.Gson.fromJson(Gson.java:852) at com.google.gson.Gson.fromJson(Gson.java:801) at com.google.gson.Gson.fromJson(Gson.java:773) at com.randomizer.CoinMarketCap.main(CoinMarketCap.java:21) Caused by: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 2 path $ at com.google.gson.stream.JsonReader.beginObject(JsonReader.java:385) at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:213) ... 5 more
你看到我的代码有什么问题吗?谢谢。
错误信息说JSON字符串包含一个数组("was BEGIN_ARRAY"),但是你尝试将它解析为一个对象("Expected BEGIN_OBJECT").
正如我们在您提供的JSON字符串中看到的那样,它确实是一个数组,您感兴趣的对象被包裹在方括号中([ ... ]
)。
尝试将其解析为 List<CryptoCurrency>
然后:
Type listType = new TypeToken<ArrayList<CryptoCurrency>>(){}.getType();
List<CryptoCurrency> list = new Gson().fromJson(jsonString, listType);
(Type
是 java.lang.reflect.Type
。)