我一直在尝试使用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;
}
答案 0 :(得分:1)
Json字符串很完美。
你的班级有4个错误将json映射到obj。 (课程曲目)
external_urls应该是一个对象,而不是列表(在所有三个地方)
艺术家名单应该在专辑类之外。
external_ids应该是对象,而不是列表(在一个地方)
在一个external_urls类中缺少spotify成员。
一般建议在使用gson时减少内部类的使用(将内部类转换为普通公共类并创建对象而不是内部类)。 在这种情况下,代码也更具可读性和可重用性。例如,如果将external_urls设计为单独的类,则只需要一个类,并且可以拥有3个成员obj,而不是现在拥有的3个内部类。如果你这样做,Gson将会完美地运作。