Здравствуйте я пытаюсь десериализации следующий JSON ответ от Web Api:Deserialize массив объектов с первым элементом является счетчик элементов
{
"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
}
]
}
Моя цель заключается в создании класса, чтобы получить предметы в ответ и использовать их в моем приложении Java Android. Проблема в том, что первым элементом массива ответов является число, а не объект, подобный следующим элементам. Поэтому, когда я анализирую его Gson это дает мне ошибку:
com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was NUMBER at line 1 column 20 path $.response[0]
Я использовал модифицированную библиотеку андроида со следующим классом POJO (ведьма работает, если я не счетчик в ответ):
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);
}
Есть ли способ заставить его работать? У меня нет доступа к серверу API, поэтому я не могу изменить способ отображения результата. Для генерации класса я использовал http://www.jsonschema2pojo.org/, но мне удалось сгенерировать его только путем удаления счетчика из ответа.
Класс обертка VKSongApi:
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);
}
}
Класс Модифицированная Интерфейс:
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);
и вызвать метод из MainActivity с:
Call<VKSongApi> call = apiService.search("test","fff9ef502df4bb10d9bf50dcd62170a24c69e98e4d847d9798d63dacf474b674f9a512b2b3f7e8ebf1d69");
call.enqueue(new Callback<VKSongApi>() {
@Override
public void onResponse(Call<VKSongApi> call, Response<VKSongApi> response) {
int statusCode = response.code();
VKSongApi song = response.body();
Log.d(TAG,response.message());
}
@Override
public void onFailure(Call<VKSongApi> call, Throwable t) {
//Here the error occurs com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was NUMBER at line 1 column 20 path $.response[0]
Log.d(TAG,"Failure");
}
});
Кажется, вопрос с номером 370968, пожалуйста, напишите код для другого класса, а упаковки 'Response' класс –
@UmaisGillani я добавил остальная часть кода – Gr33nLight
@ Gr33nLight Проблема связана с ответом (370968) без ключа. Вы не можете получить доступ к значению без ключа в модификации, но ручная разборка может быть выполнена. – JUL2791