反序列化对象数组,第一个项目是元素的计数器

时间:2016-11-20 12:50:37

标签: java android json retrofit retrofit2

您好我试图从Web Api反序列化以下JSON响应:

#ifdef CURAND_H_
// cuRAND API errors
static const char *curandGetErrorString(curandStatus_t error)
{
    switch (error)
    {
        case CURAND_STATUS_SUCCESS:
            return "CURAND_STATUS_SUCCESS";

        case CURAND_STATUS_VERSION_MISMATCH:
            return "CURAND_STATUS_VERSION_MISMATCH";

        case CURAND_STATUS_NOT_INITIALIZED:
            return "CURAND_STATUS_NOT_INITIALIZED";

        case CURAND_STATUS_ALLOCATION_FAILED:
            return "CURAND_STATUS_ALLOCATION_FAILED";

        case CURAND_STATUS_TYPE_ERROR:
            return "CURAND_STATUS_TYPE_ERROR";

        case CURAND_STATUS_OUT_OF_RANGE:
            return "CURAND_STATUS_OUT_OF_RANGE";

        case CURAND_STATUS_LENGTH_NOT_MULTIPLE:
            return "CURAND_STATUS_LENGTH_NOT_MULTIPLE";

        case CURAND_STATUS_DOUBLE_PRECISION_REQUIRED:
            return "CURAND_STATUS_DOUBLE_PRECISION_REQUIRED";

        case CURAND_STATUS_LAUNCH_FAILURE:
            return "CURAND_STATUS_LAUNCH_FAILURE";

        case CURAND_STATUS_PREEXISTING_FAILURE:
            return "CURAND_STATUS_PREEXISTING_FAILURE";

        case CURAND_STATUS_INITIALIZATION_FAILED:
            return "CURAND_STATUS_INITIALIZATION_FAILED";

        case CURAND_STATUS_ARCH_MISMATCH:
            return "CURAND_STATUS_ARCH_MISMATCH";

        case CURAND_STATUS_INTERNAL_ERROR:
            return "CURAND_STATUS_INTERNAL_ERROR";
    }

    return "<unknown>";
}
#endif

我的目的是构建一个类来获取响应中的项目并在我的Java Android应用程序中使用它们。问题是响应数组的第一项是数字,而不是像下一项那样的对象。因此,当我用Gson解析它时,它给了我错误:

{
    "response": [
        370968,
        {
            "aid": 65843156,
            "owner_id": 17519165,
            "artist": "Bass Test",
            "title": "дурной басс!",
            "duration": 238,
            "url": "http://cs6-10v4.vk-cdn.net/p22/c412a04df93035.mp3?extra=9YguhLftfZDDwo4JKBVwvlx_V1vwlu5pNU4-WremEqM9bL8eN2vh3_qu7bAg9EgNCj0ztEcMurarC499x8X2MpUaipykG2LDueWe0QQMrIPplkxKdV1xcQp35baDwA84l-luVxai9maX",
            "lyrics_id": "6214304"
        },
        {
            "aid": 207425918,
            "owner_id": 96085484,
            "artist": "► DJ Pleased",
            "title": "Bass Test № 04 (New 2013)",
            "duration": 328,
            "url": "http://cs6-7v4.vk-cdn.net/p23/6d7071221fb912.mp3?extra=O5ih5W5YkaEkXhHQSOKeDzvtr0V8xyS1WhIgjYLROFOMcW__FpU3mSf5udwdEAq6kkcz7QSy5jB57rTgSxnRJXCySZy2b0J_a2DvzFUBqVX6lcKqlarTryP_loQyk-SYPbFLh-9mSzm_iA",
            "lyrics_id": "86651563",
            "genre": 10
        }
    ]
}

我使用了改进的android库和下面的POJO类(如果我没有在响应中使用计数器,则可以使用):

com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was NUMBER at line 1 column 20 path $.response[0]

有什么方法可以让它发挥作用吗?我无法访问API服务器,因此无法更改结果的显示方式。要生成我使用http://www.jsonschema2pojo.org/的类,但我只能通过从响应中删除计数器来生成它。

包装类VKSongApi:

import java.util.HashMap;
import java.util.Map;

public class Response {

private Integer aid;
private Integer ownerId;
private String artist;
private String title;
private Integer duration;
private String url;
private String lyricsId;
private Integer genre;
private String album;
private Map<String, Object> additionalProperties = new HashMap<String, Object>();

/**
 *
 * @return
 * The aid
 */
public Integer getAid() {
    return aid;
}

/**
 *
 * @param aid
 * The aid
 */
public void setAid(Integer aid) {
    this.aid = aid;
}

/**
 *
 * @return
 * The ownerId
 */
public Integer getOwnerId() {
    return ownerId;
}

/**
 *
 * @param ownerId
 * The owner_id
 */
public void setOwnerId(Integer ownerId) {
    this.ownerId = ownerId;
}

/**
 *
 * @return
 * The artist
 */
public String getArtist() {
    return artist;
}

/**
 *
 * @param artist
 * The artist
 */
public void setArtist(String artist) {
    this.artist = artist;
}

/**
 *
 * @return
 * The title
 */
public String getTitle() {
    return title;
}

/**
 *
 * @param title
 * The title
 */
public void setTitle(String title) {
    this.title = title;
}

/**
 *
 * @return
 * The duration
 */
public Integer getDuration() {
    return duration;
}

/**
 *
 * @param duration
 * The duration
 */
public void setDuration(Integer duration) {
    this.duration = duration;
}

/**
 *
 * @return
 * The url
 */
public String getUrl() {
    return url;
}

/**
 *
 * @param url
 * The url
 */
public void setUrl(String url) {
    this.url = url;
}

/**
 *
 * @return
 * The lyricsId
 */
public String getLyricsId() {
    return lyricsId;
}

/**
 *
 * @param lyricsId
 * The lyrics_id
 */
public void setLyricsId(String lyricsId) {
    this.lyricsId = lyricsId;
}

/**
 *
 * @return
 * The genre
 */
public Integer getGenre() {
    return genre;
}

/**
 *
 * @param genre
 * The genre
 */
public void setGenre(Integer genre) {
    this.genre = genre;
}

/**
 *
 * @return
 * The album
 */
public String getAlbum() {
    return album;
}

/**
 *
 * @param album
 * The album
 */
public void setAlbum(String album) {
    this.album = album;
}

public Map<String, Object> getAdditionalProperties() {
    return this.additionalProperties;
}

public void setAdditionalProperty(String name, Object value) {
    this.additionalProperties.put(name, value);
}

改装界面类是:

public class VKSongApi {

private List<Response> response = new ArrayList<Response>();
private Map<String, Object> additionalProperties = new HashMap<String, Object>();

/**
 *
 * @return
 * The response
 */
public List<Response> getResponse() {
    return response;
}

/**
 *
 * @param response
 * The response
 */
public void setResponse(List<Response> response) {
    this.response = response;
}

public Map<String, Object> getAdditionalProperties() {
    return this.additionalProperties;
}

public void setAdditionalProperty(String name, Object value) {
    this.additionalProperties.put(name, value);
}

}

然后在MainActivity中我做:

public interface VKApi  {
@GET("/method/audio.search")
Call<VKSongApi> search(@Query("q") String query, @Query("access_token") String token);
}

从MainActivity调用方法:

public static final String BASE_URL = "https://api.vk.com/method/";
Retrofit retrofit = new Retrofit.Builder()
        .baseUrl(BASE_URL)
        .addConverterFactory(GsonConverterFactory.create())
        .build();
VKApi apiService =
        retrofit.create(VKApi.class);

1 个答案:

答案 0 :(得分:0)

我通过使用自定义反序列化器类手动解析响应来解决