【问题标题】:Parsing JSON in JAVA usng Gson使用 Gson 在 JAVA 中解析 JSON
【发布时间】:2017-09-16 10:47:18
【问题描述】:

所以我正在尝试使用 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);

    }
}

我得到一个错误

线程“主”com.google.gson.JsonSyntaxException 中的异常: java.lang.IllegalStateException:应为 BEGIN_OBJECT,但为 第 1 行第 2 列路径 $ 处的 BEGIN_ARRAY com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:224) 在 com.google.gson.Gson.fromJson(Gson.java:887) 在 com.google.gson.Gson.fromJson(Gson.java:852) 在 com.google.gson.Gson.fromJson(Gson.java:801) 在 com.google.gson.Gson.fromJson(Gson.java:773) 在 com.randomizer.CoinMarketCap.main(CoinMarketCap.java:21) 原因: java.lang.IllegalStateException:应为 BEGIN_OBJECT,但为 第 1 行第 2 列路径 $ 处的 BEGIN_ARRAY com.google.gson.stream.JsonReader.beginObject(JsonReader.java:385) 在 com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:213) ... 5 更多

您发现我的代码有什么问题吗?谢谢。

【问题讨论】:

  • 请也显示一个示例 JSON。似乎在某些时候 JSON 包含一个数组,但您尝试将其存储在一个对象中。
  • How to deserialize a JSON array using Gson 的可能重复项。您的 JSON 是一个仅包含一个对象的数组,因此您需要反序列化该数组。
  • 1) 为什么要请求 XML 并尝试解析 JSON? 2) 打印bitcoinDetails。这是什么?
  • 这是 JSON 作为字符串。我想把它反序列化成一个对象。

标签: java json parsing jersey gson


【解决方案1】:

错误消息说 JSON 字符串包含一个数组(“was BEGIN_ARRAY”),但您尝试将其解析为对象(“预期 BEGIN_OBJECT”) .

正如我们在您提供的 JSON 字符串中看到的,它确实是一个数组,您感兴趣的对象包含在方括号中 ([ ... ])。

尝试将其解析为例如List<CryptoCurrency> 然后:

Type listType = new TypeToken<ArrayList<CryptoCurrency>>(){}.getType();
List<CryptoCurrency> list = new Gson().fromJson(jsonString, listType);

Typejava.lang.reflect.Type。)

【讨论】:

  • 是的,你是对的。我是 JSON 的新手,我什至没有看到唯一的对象在数组中。我最终只是拿走了我的代码并将我的 Wrapper(名为 CryptoCurrency)变成了一个数组。我改变的是: CryptoCurrency[] arr = gson.fromJson(bitoinDeteils, CryptoCurrency[].class);然后只需访问 CryptoCurrency[0]
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-01
  • 2011-07-26
  • 1970-01-01
  • 2020-09-17
  • 1970-01-01
  • 2011-04-26
相关资源
最近更新 更多