MusixMatch API 和 GSON:使用 track.snippet.get 而不是 track.lyrics.get

MusixMatch API and GSON: Using track.snippet.get instead of track.lyrics.get

我正在为 Java class 做介绍的期末项目。该项目的一部分涉及从 MusixMatch using their API 获取歌词片段。我可以使用 track.lyrics.get 从 API 获取歌词,但无法使用 tracks.snippet.get.

获取片段

我从此处找到的 Java 包装器开始:https://github.com/sachin-handiekar/jMusixMatch 并添加了我自己的 classes 以获得基于 track.snippet.get API 的片段方法。

当我 运行 程序时,我得到这个错误:

java.lang.IllegalStateException: Expected a string but was BEGIN_OBJECT at 
line 1 column 102 path $.message.body

我的 getSnippet 方法和适用的 class 方法如下。它们基于原始包装器中的 getLyrics 方法和 classes。

public Snippet getSnippet(int trackID) throws MusixMatchException {
    Snippet snippet = null;
    SnippetGetMessage message = null;
    Map<String, Object> params = new HashMap<String, Object>();

    params.put(Constants.API_KEY, apiKey);
    params.put(Constants.TRACK_ID, new String("" + trackID));

    String response = null;

    response = MusixMatchRequest.sendRequest(Helper.getURLString(
            Methods.TRACK_SNIPPET_GET, params));

    Gson gson = new Gson();

    try {
        message = gson.fromJson(response, SnippetGetMessage.class);
    } catch (JsonParseException jpe) {
        handleErrorResponse(response);
    }

    snippet = message.getContainer().getBody().getSnippet();

    return snippet;
}

Snippet Class

package org.jmusixmatch.entity.snippet;

import com.google.gson.annotations.SerializedName;

/**
 * Created by kyledhebert on 4/30/15.
 * Objects of this clas represent a lyric snippet from the
 * MusixMatch API.
 */
public class Snippet {

    @SerializedName("snippet_language")
    private int snippetLanguage;

    @SerializedName("restricted")
    private int restricted;

    @SerializedName("instrumental")
    private int instrumental;

    @SerializedName("snippet_body")
    private String snippetBody;

    @SerializedName("script_tracking_url")
    private String scriptTrackingURL;

    @SerializedName("pixel_tracking_url")
    private String pixelTrackingURL;

    @SerializedName("html_tracking_url")
    private String htmlTrackingURL;

    @SerializedName("updated_time")
    private String updatedTime;

    public int getSnippetLanguage() {
        return snippetLanguage;
    }

    public void setSnippetLanguage(int snippetLanguage) {
        this.snippetLanguage = snippetLanguage;
    }

    public int getRestricted() {
        return restricted;
    }

    public void setRestricted(int restricted) {
        this.restricted = restricted;
    }

    public int getInstrumental() {
        return instrumental;
    }

    public void setInstrumental(int instrumental) {
        this.instrumental = instrumental;
    }

    public String getSnippetBody() {
        return snippetBody;
    }

    public void setSnippetBody(String snippetBody) {
        this.snippetBody = snippetBody;
    }

    public String getPixelTrackingURL() {
        return pixelTrackingURL;
    }

    public void setPixelTrackingURL(String pixelTrackingURL) {
        this.pixelTrackingURL = pixelTrackingURL;
    }

    public String getScriptTrackingURL() {
        return scriptTrackingURL;
    }

    public void setScriptTrackingURL(String scriptTrackingURL) {
        this.scriptTrackingURL = scriptTrackingURL;
    }

    public String getHtmlTrackingURL() {
        return htmlTrackingURL;
    }

    public void setHtmlTrackingURL(String htmlTrackingURL) {
        this.htmlTrackingURL = htmlTrackingURL;
    }

    public String getUpdatedTime() {
        return updatedTime;
    }

    public void setUpdatedTime(String updatedTime) {
        this.updatedTime = updatedTime;
    }
}

SnippetGetBody class:

package org.jmusixmatch.entity.snippet.get;

import com.google.gson.annotations.SerializedName;

import org.jmusixmatch.entity.snippet.Snippet;

public class SnippetGetBody {

    @SerializedName("snippet")
    private Snippet snippet;

    public Snippet getSnippet() {
        return snippet;
    }

    public void setSnippet(Snippet snippet) {
        this.snippet = snippet;
    }
}

SnippetGetContainer class:

package org.jmusixmatch.entity.snippet.get;

import com.google.gson.annotations.SerializedName;

import org.jmusixmatch.entity.Header;

public class SnippetGetContainer {

    @SerializedName("body")
    private SnippetGetBody body;

    @SerializedName("header")
    private Header header;

    public SnippetGetBody getBody() {
        return body;
    }

    public void setBody(SnippetGetBody body) {
        this.body = body;
    }

    public Header getHeader() {
        return header;
    }

    public void setHeader(Header header) {
        this.header = header;
    }
}

SnippetGetMessage class:

package org.jmusixmatch.entity.lyrics.get;

import com.google.gson.annotations.SerializedName;

public class SnippetGetMessage {
  @SerializedName("message")
  private SnippetGetContainer container;

  public void setContainer(SnippetGetContainer container) {
    this.container = container;
  }

  public SnippetGetContainer getContainer() {
    return container;
  }
}

我无法重现您的确切错误消息,但我确实发现了以下错误:snippet_language 是一个字符串,而不是 int。将类型(以及关联的 getter 和 setter)更改为:

@SerializedName("snippet_language")
private String snippetLanguage;

我使用了来自 here to make this work. If these two changes don't fix your problem, please edit 你的问题的示例 Json 响应与导致你的程序无法运行的实际 Json 响应。