2017-09-16 1 views
0

Also ich versuche, ein JSON-Objekt in Java mit Gson zu analysieren. Ich versuche, eine API von einer Website zu konsumieren. Dies ist der Ticker: https://api.coinmarketcap.com/v1/ticker/bitcoin/Parsen von JSON in JAVA usng Gson

Die JSON sieht wie folgt aus:

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

I Jersey bin mit dem API für das Konsumieren und ich möchte diese JSON in ein Objekt verwandeln.

Dies ist das Objekt, das durch Parsen der JSON gebaut werden soll:

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; 

} 

Dies ist mein Code:

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); 

    } 
} 

Ich erhalte einem Fehler

Exception in thread " main "com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Erwartete BEGIN_OBJECT aber war BEGIN_ARRAY in Zeile 1 Spalte 2 Pfad $ unter com.google.gson.internal.bind.ReflectiveTypeAdapterFactory $ Adapter.read (ReflectiveTypeAdapterFactory.java:224) bei com.google.gson.Gson.fromJson (Gson.java:887) um com.google.gson.Gson.fromJson (Gson.java:852) um com.google.gson.Gson.fromJson (Gson.java:801) um com.google.gson.Gson.fromJson (Gson .java: 773) bei com.randomizer.CoinMarketCap.main (CoinMarketCap.java:21) verursacht durch: java.lang.IllegalStateException: Erwartete BEGIN_OBJECT aber war bei com.google BEGIN_ARRAY in Zeile 1 Spalte 2 Pfad $. gson.stream.JsonReader.beginObject (JsonReader.java:385) um com.google.gson.internal.bind.ReflectiveTypeAdapterFactory $ Adapter.read (R eflectiveTypeAdapterFactory.java:213) ... 5 mehr

Haben Sie etwas falsch in meinem Code zu sehen? Vielen Dank.

+0

zeigen Bitte ein Beispiel zu JSON. Anscheinend enthält der JSON ein Array, aber Sie versuchen, es in einem Objekt zu speichern. – juzraai

+0

Mögliches Duplikat von [Wie ein JSON-Array mit Gson deserialisiert wird] (https://stackoverflow.com/questions/10292514/how-to- deserialize-a-json-array-using-gson). Ihr JSON ist ein Array, das nur ein Objekt enthält. Daher müssen Sie das Array deserialisieren. –

+0

1) Warum fordern Sie XML an und versuchen, JSON zu analysieren? 2) Print 'bitcoinDetails'. Was ist es? –

Antwort

1

Die Fehlermeldung besagt, dass die JSON-String ein Array enthält ("war BEGIN_ARRAY"), aber Sie versuchen, es als Objekt analysieren ("Expected BEGIN_OBJECT").

Wie Sie in der von Ihnen bereitgestellten JSON-Zeichenfolge sehen, handelt es sich tatsächlich um ein Array. Das Objekt, an dem Sie interessiert sind, ist in eckige Klammern eingeschlossen ([ ... ]).

Versuchen Sie es als List<CryptoCurrency> zum Beispiel zu analysieren dann:

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

(Typejava.lang.reflect.Type ist.)

+0

Ja, Sie haben Recht. Ich war neu in JSON, ich habe nicht einmal gesehen, dass das einzige Objekt in einem Array ist. Ich habe gerade meinen Code genommen und meinen Wrapper (namens CryptoCurrency) zu einem Array gemacht. Was ich geändert habe, war: \t \t CryptoCurrency [] arr = gson.fromJson (bitoinDeteils, CryptoCurrency []. Klasse); und dann nur Zugriff auf CryptoCurrency [0] – NotSure