2016-11-20 1 views
0

Здравствуйте я пытаюсь десериализации следующий 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"); 
     } 
    }); 
+0

Кажется, вопрос с номером 370968, пожалуйста, напишите код для другого класса, а упаковки 'Response' класс –

+0

@UmaisGillani я добавил остальная часть кода – Gr33nLight

+0

@ Gr33nLight Проблема связана с ответом (370968) без ключа. Вы не можете получить доступ к значению без ключа в модификации, но ручная разборка может быть выполнена. – JUL2791

ответ

0

Я решил путем анализа вручную ответа с использованием пользовательского десериализатором класса

 Смежные вопросы

  • Нет связанных вопросов^_^