【问题标题】:IllegalStateException: This is not a JSON Array (Gson Java)IllegalStateException:这不是 JSON 数组 (Gson Java)
【发布时间】:2016-02-19 17:59:23
【问题描述】:

我一直在尝试使用 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;
}

【问题讨论】:

  • “这不是 JSON 数组”如何作为消息不够清晰?或者您是否不理解 JSON object 和 JSON array 之间的区别?请参考 RFC 7159
  • 什么不是 JSON 数组。我正在传递的链接呢?我列出的代码?并回答你的问题。我以为我做到了,但我想我没有。我使用的指南是否导致我做出任何不正确的假设?
  • 我就是这么说的。我点击了链接。它是一个 JSON OBJECT。请阅读 RFC 7159 和 json.org

标签: java json gson spotify


【解决方案1】:

Json 字符串是完美的。

你的类中有 4 个错误将 json 映射到 obj。 (类曲目)

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

  2. 艺术家列表应在专辑类别之外。

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

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

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

【讨论】:

  • 确认external_urls应该是External_Urls类型的对象吗?这是否意味着我会更改其他列表,如果是,为什么不呢? (努力学习)
  • 我也按照您的建议进行了更改。首先感谢您的帮助,但我仍然遇到同样的问题。
猜你喜欢
  • 2018-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-23
相关资源
最近更新 更多