В вашем json fromat массив JSON содержит смешанные типы. Deserialization with fromJson() не будет работать, поскольку Gson не имеет никакого способа узнать, как сопоставить входные данные с типами. Gson требует, чтобы вы предоставили обобщенную версию типа коллекции fromJson. Итак, у вас есть три варианта:
Вариант 1: Использовать API-анализатор Gson.
Вариант 2: Зарегистрируйте адаптер типа Collection.class.
Вариант 3: Зарегистрируйте адаптер типа MyCollectionMemberType. Этот подход практичен только в том случае, если массив отображается как элемент верхнего уровня. Здесь в вашем случае вариант 3 лучше всего, потому что массив находится на элементах верхнего уровня объекта ответа. Я следовал смешанный вариант подхода 1 & 3.
Для более подробно см Serializing and Deserializing Collection with Objects of Arbitrary Types using Gson Gson Collections Limitations
The complex part in your json format is deserialize total record number
in Wall class object
Вот хитрая часть десериализации JSON в объекты Java.
GsonBuilder b = new GsonBuilder();
b.registerTypeAdapter(WallResponse.class,new JsonDeserializer<WallResponse>() {
@Override
public WallResponse deserialize(JsonElement jsonElement,Type typeOf, JsonDeserializationContext context) throws JsonParseException {
final Gson g = new Gson();
final JsonObject jsonObject = jsonElement.getAsJsonObject();
final WallResponse wallResponse = new WallResponse(new Response());
final Entry<String, JsonElement> entry = jsonObject.entrySet().iterator().next();
final JsonElement element = entry.getValue();
final JsonObject jsonObject2 = element.getAsJsonObject();
final Entry<String, JsonElement> entry2 = jsonObject2.entrySet().iterator().next();
final JsonArray jsonArray = entry2.getValue().getAsJsonArray();
final Iterator<JsonElement> jsonElement2 = jsonArray.iterator();
int totalRecord=-1;
while (jsonElement2.hasNext()) {
final JsonElement element2 = jsonElement2.next();
if (element2.isJsonPrimitive())
totalRecord=element2.getAsInt();
if (element2.isJsonObject()) {
final Wall wall = g.fromJson(element2, Wall.class);
wall.setTotalRecord(totalRecord);
List<Wall> walls= new ArrayList<>();
walls.add(wall);
wallResponse.getResponse().setWall(walls);
}
}
return wallResponse;
}
});
WallResponse response = b.create().fromJson(reader, WallResponse.class);
Java модели классы, как показано ниже в соответствии с форматом JSon
WallResponse класса
public class WallResponse {
private Response response;
public WallResponse() { super();{
public WallResponse(Response response) {super();this.response = response;}
public Response getResponse() { return this.response;}
public void setResponse(Response response) { this.response = response; }
@Override
public String toString() { return "WallResponse [response=" + response + "]"; }
}
Response Класс
public class Response {
private List<Wall> wall;
public List<Wall> getWall() { return this.wall; }
public void setWall(List<Wall> wall) { this.wall = wall; }
@Override
public String toString() { return "Response [wall=" + wall + "]"; }
}
Стена класса
public class Wall {
private int totalRecord;
private Media media;
private Attachment attachment;
private List<Attachments> attachments;
@SerializedName(value = "post_source")
private PostSource postSource;
private Comments comments;
@SerializedName(value = "likes")
private Like like;
@SerializedName(value = "reposts")
private Repost repost;
private String id;
private String from_id;
private String to_id;
private String date;
private String post_type;
private String text;
private String can_delete;
private String reply_count;
private String online;
// setter getter here
}
Медиа класса
public class Media {
private String type;
private String owner_id;
private String item_id;
private String thumb_src;
//setter getter here
@Override
public String toString() {
return "Media [type=" + type + ", owner_id=" + owner_id + ", item_id="
+ item_id + ", thumb_src=" + thumb_src + "]";
}
}
Attachment Класс
public class Attachment {
private String type;
private Photo photo;
// setter getter here
@Override
public String toString() {
return "Attachment [type=" + type + ", photo=" + photo + "]";
}
}
Вложения
public class Attachments {
private String type;
private Photo photo;
// getter setter here
@Override
public String toString() {
return "Attachment [type=" + type + ", photo=" + photo + "]";
}
}
фотография класса, составленные дополнения и Приложения класса
public class Photo {
private String pid;
private String aid;
private String owner_id;
private String src;
private String src_big;
private String src_small;
private String src_xbig;
private String width;
private String height;
private String text;
private String created;
private String access_key;
// setter getter here
@Override
public String toString() {
return "Photo [pid=" + pid + ", aid=" + aid + ", owner_id=" + owner_id
+ ", src=" + src + ", src_big=" + src_big + ", src_small="
+ src_small + ", src_xbig=" + src_xbig + ", width=" + width
+ ", height=" + height + ", text=" + text + ", created="
+ created + ", access_key=" + access_key + "]";
}
}
базовая модель класса для общих свойств в Commen ts, Report и Like class.
public class BaseModel {
private String type;
private int count;
public void setType(String type) { this.type = type; }
public String getType() {return type;}
public int getCount() { return count;}
public void setCount(int count) {this.count = count;}
@Override
public String toString() {return "BaseModel [type=" + type + ", count=" + count + "]";}
}
Комментарии Класс
public class Comments extends BaseModel {
private String can_post;
@Override
public String toString() {
return "Comments [count=" + getCount() + ", can_post=" + can_post + "]";
}
}
Как класс
public class Like extends BaseModel {
private int user_likes;
private String can_like;
private String can_publish;
@Override
public String toString() {
return "Like [user_likes=" + user_likes + ", can_like=" + can_like
+ ", can_publish=" + can_publish + ", count =" + getCount()
+ "]";
}
}
Отчет класса
public class Repost extends BaseModel {
private String user_reposted;
@Override
public String toString() {
return "Repost [user_reposted=" + user_reposted + ", count=" + getCount() + "]";
}
}
Наконец ваш график объект будет выглядеть следующим образом
// wallResponse object.
WallResponse [ // response object
response=Response
[wall= // wall object
[Wall [totalRecord=10, media=Media [type=photo, owner_id=21454540, item_id=314573297, thumb_src=http://cs313417.vk.me/v313417540/6cc9/Ze-8KY9tYfc.jpg],
attachment=Attachment [type=photo,
// photo object inside attachment
photo=Photo [pid=314573297, aid=-5, owner_id=21454540, src=http://cs313417.vk.me/v313417540/6cc9/Ze-8KY9tYfc.jpg, src_big=http://cs313417.vk.me/v313417540/6cca/ndKUage2w4I.jpg, src_small=http://cs313417.vk.me/v313417540/6cc8/A5m7zXxTAlQ.jpg, src_xbig=http://cs313417.vk.me/v313417540/6ccb/gaW8MQhFiFQ.jpg, width=760, height=606, text=, created=1384634699, access_key=bafb734c3dd74c5656]],
attachments=[Attachment [type=photo,
// photo object inside attachements
photo=Photo [pid=314573297, aid=-5, owner_id=21454540, src=http://cs313417.vk.me/v313417540/6cc9/Ze-8KY9tYfc.jpg, src_big=http://cs313417.vk.me/v313417540/6cca/ndKUage2w4I.jpg, src_small=http://cs313417.vk.me/v313417540/6cc8/A5m7zXxTAlQ.jpg, src_xbig=http://cs313417.vk.me/v313417540/6ccb/gaW8MQhFiFQ.jpg, width=760, height=606, text=, created=1384634699, access_key=bafb734c3dd74c5656]]],
// postSource object
postSource=PostSource [getType()=vk],
// comments object
comments=Comments [count=0, can_post=1], like=Like [user_likes=0, can_like=1, can_publish=0, count =1],
//report object
repost=Repost [user_reposted=0, count=0],
// wall data...
id=727, from_id=21454540, to_id=52158932, date=1384634706, post_type=post, text=, can_delete=1, reply_count=0, online=0]]]]
Наслаждайтесь! :)
Вы не можете быть Биллом Гейтсом, используя Java и Gson. Но чтобы попытаться указать вас в правильном направлении, проверьте официальные документы: https://sites.google.com/site/gson/gson-user-guide –
Мне нравится комментарий Рикардо и проголосовал за кулак. –
Вот пример http://thegeekyland.blogspot.com/2015/11/serializing-and-deserializing-json-from.html – Arlind