IllegalStateException:这不是JSON数组(Gson Java)

时间:2016-02-19 17:59:23

标签: java json gson spotify

我一直在尝试使用Gson创建一种导入曲目数据的方法。这是我第一次尝试使用Gson,我很难理解我哪里出错了。我正在尝试使用spotify的json。这是我正在使用的地址。 https://api.spotify.com/v1/search?q=%22Perform%20this%20way%22&type=track 我已经创建了一个类来导入它。我一直在关注这个指南。 http://www.javabeat.net/invoking-restful-web-service-using-api-in-java-net-and-gson/

输入我的查询后我收到以下错误,并且可以继续...

Exception in thread "main" java.lang.IllegalStateException: This is not a JSON Array.
    at com.google.gson.JsonElement.getAsJsonArray(JsonElement.java:106)
    at TestingNonApplication.GsonTesting.main2(GsonTesting.java:72)

- 指这一行。 JsonArray jArray = rootElement.getAsJsonArray();

我有什么遗漏的吗?我不确定是否需要toString或序列化。

  package TestingNonApplication;

import com.google.gson.Gson;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonParser;
import com.google.gson.stream.JsonReader;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URLConnection;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author Scorchgid
 */
public class GsonTesting {

    /**
     * @param args the command line arguments
     */
    String baseURLStart = "http://api.spotify.com/v1/search?q=\"";
    String baseURLEnd = "\"&type=track";
    String jsonSource;

    public static void main(String[] args) {
        try {
            GsonTesting gTest = new GsonTesting();
            gTest.main2();
        } catch (FileNotFoundException ex) {
            Logger.getLogger(GsonTesting.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(GsonTesting.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public void main2() throws FileNotFoundException, MalformedURLException, IOException {
        Scanner commandlineReader = new Scanner(System.in);
        String searchString = "";
        boolean contin = false;
        while (contin == false) {
            System.out.println("Enter query");
            String query = commandlineReader.nextLine();
            searchString = baseURLStart + query + baseURLEnd;
            searchString = searchString.replace(" ", "%20");
            System.out.println(searchString
                    + "\r\n Type Yes to continue or anything else to re enter");
            query = commandlineReader.nextLine();
            if (query.equalsIgnoreCase("yes")) {
                contin = true;
            }
        }
        //----------------------------------------------------------------------
        /* Connection and Response */
        URLConnection urlConnection = new URL(searchString).openConnection();
        urlConnection.connect();

        JsonReader reader = new JsonReader(new InputStreamReader(urlConnection.getInputStream()));
        JsonParser jsonParser = new JsonParser();
        JsonElement rootElement = jsonParser.parse(reader);
        JsonArray jArray = rootElement.getAsJsonArray();

        List results = new ArrayList();
        Gson gson = new Gson();
        for (JsonElement spotifyElement : jArray) {
            Tracks spot = gson.fromJson(rootElement, Tracks.class);
            results.add(spot);
            System.out.println(spot.toString());
        }
    }
}

class Tracks {

    String href;
    List<Items> items;

    public class Items {

        Album albums;

        public class Album {

            String album_type;
            String[] available_markets;
            External_Urls external_urls;

            public class External_Urls {

                String spotify;
            }
            String href;
            String id;
            List<Image> images;

            public class Image {

                Integer height;
                String url;
                Integer width;
            }
            String name;
            String type;
            String uri;
            List<Artists> artists;
        }

        List<Artists> artist;

        public class Artists {

            External_Urls external_urls;

            public class External_Urls {

                String spotify;
            }

            String herf;
            String id;
            String name;
            String type;
            String uri;
        }

        String avaliable_markets;
        Integer disc_number;
        Integer duration;
        Boolean explicity;
        External_Urls external_ids;

        public class External_Ids {

            String isrc;
        }
        External_Urls external_urls;

        public class External_Urls {

            String spotify;
        }
        String herf;
        String id;
        String name;
        Integer popularity;
        String preview_url;
        Integer tracknumber;
        String type;
        String uri;

    }

    Integer limit;
    String next;
    Integer offset;
    String previous;
    Integer total;
}

1 个答案:

答案 0 :(得分:1)

Json字符串很完美。

你的班级有4个错误将json映射到obj。 (课程曲目)

  1. external_urls应该是一个对象,而不是列表(在所有三个地方)

  2. 艺术家名单应该在专辑类之外。

  3. external_ids应该是对象,而不是列表(在一个地方)

  4. 在一个external_urls类中缺少spotify成员。

  5. 一般建议在使用gson时减少内部类的使用(将内部类转换为普通公共类并创建对象而不是内部类)。 在这种情况下,代码也更具可读性和可重用性。例如,如果将external_urls设计为单独的类,则只需要一个类,并且可以拥有3个成员obj,而不是现在拥有的3个内部类。如果你这样做,Gson将会完美地运作。