2013-11-24 7 views
0

У меня есть текущая структура JSON. Это не более чем список объектов.Parse Json using gson

{ 
    "response": { 
     "wall": [366, 
     { 
      "id": 727, 
      "from_id": 21454540, 
      "to_id": 52158932, 
      "date": 1384634706, 
      "post_type": "post", 
      "text": "", 
      "can_delete": 1, 
      "media": { 
       "type": "photo", 
       "owner_id": 21454540, 
       "item_id": 314573297, 
       "thumb_src": "http:\/\/cs313417.vk.me\/v313417540\/6cc9\/Ze-8KY9tYfc.jpg" 
      }, 
      "attachment": { 
       "type": "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": [{ 
       "type": "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" 
       } 
      }], 
      "post_source": { 
       "type": "vk" 
      }, 
      "comments": { 
       "count": 0, 
       "can_post": 1 
      }, 
      "likes": { 
       "count": 1, 
       "user_likes": 0, 
       "can_like": 1, 
       "can_publish": 0 
      }, 
      "reposts": { 
       "count": 0, 
       "user_reposted": 0 
      }, 
      "online": 0, 
      "reply_count": 0 
     }, 
     { 
      .... 
      .... 
     }] 
    } 
} 

Я хочу использовать GSON для его анализа в JAVA-объектах. Я создал класс java класса Wall для хранения всей информации об объекте. Также текущий ответ содержит информацию об общем количестве этих объектов на стороне сервера. Номер 366. (Обратите внимание, что это не длина списка в ответе, это общие записи количества на стороне сервера). Я действительно смущен, что с этим делать?

Вопрос: Как должен выглядеть класс модели Java, чтобы успешно десериализовать объекты и общее количество записей? Я хочу, чтобы ответ был сериализован во что-то вроде:

public class WallResponse 
{ 
    private int totalRecords; 
    private List<Wall> wallRecordsList; 

    //getters and setters 
} 

Большое спасибо !!!

+2

Вы не можете быть Биллом Гейтсом, используя Java и Gson. Но чтобы попытаться указать вас в правильном направлении, проверьте официальные документы: https://sites.google.com/site/gson/gson-user-guide –

+0

Мне нравится комментарий Рикардо и проголосовал за кулак. –

+0

Вот пример http://thegeekyland.blogspot.com/2015/11/serializing-and-deserializing-json-from.html – Arlind

ответ

1

В вашем 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]]]] 

Наслаждайтесь! :)

1

JSONGen может быть полезен для создания объектов, обратите внимание, что некоторые ручные обработки могут понадобиться последним для более конкретных типов, но это определенно будет хорошим началом.