2017-09-16 26 views
0

Gsonを使用してJavaでJSONオブジェクトを解析しようとしています。 私はウェブサイトからAPIを消費しようとしています。 これはティッカーです: https://api.coinmarketcap.com/v1/ticker/bitcoin/JavaでJSONを解析するGson

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" 
    } 
] 

私は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が予想されましたが、でしたBEGIN_ARRAY 1行目の列2のパス$ com.google.gson.internal.bind.ReflectiveTypeAdapterFactory $ Adapter.read(ReflectiveTypeAdapterFactory.java:224) at 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.json: .java:773)によって引き起こさ com.randomizer.CoinMarketCap.main(CoinMarketCap.java:21)において: java.lang.IllegalStateException:期待BEGIN_OBJECTしかし com.googleのライン1カラム2パス$で BEGIN_ARRAYでした。 gson.stream.JsonReader.beginObject(JsonReader.java:385)at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory $ Adapter.read(R eflectiveTypeAdapterFactory.java:213) ... 5 more

私のコードに間違いがありますか?ありがとう。

+0

があまりにも例JSONをご提示ください。ある時点でJSONに配列が含まれているように見えますが、オブジェクトに格納しようとしています。 – juzraai

+0

[Gsonを使用してJSON配列をデシリアライズする方法](https://stackoverflow.com/questions/10292514/how-to-deserialize-a-json-array-using-gson)の可能な複製。 JSONは1つのオブジェクトだけを含む配列なので、配列を逆シリアル化する必要があります。 –

+0

1)なぜXMLをリクエストしてJSONを解析しようとしていますか? 2) 'bitcoinDetails'を表示します。それは何ですか? –

答えて

1

エラーメッセージは、JSON文字列が配列(「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である。)

+0

はい、あなたは正しいです。私はJSONの初心者ですが、唯一のオブジェクトが配列内にあることさえわかりませんでした。私はちょうど私のコードを取って、Wrapper(CryptoCurrencyという名前)を配列にしてしまった。私が変更したのは:\t \t CryptoCurrency [] arr = gson.fromJson(bitoinDeteils、CryptoCurrency []。class); CryptoCurrencyにアクセスするだけです[0] – NotSure

関連する問題