android - How to make Retrofit class -


i trying use retrofit library make api requests riot api , example request returns json looks this:

{"dyrus":{"id":5908,"name":"dyrus","profileiconid":752,"summonerlevel":30,"revisiondate":1431126576000}} 

notice object dyrus has multiple sub properties , want id property. problem having don't want id dyrus other players well. when other players name of object changes depending on name up. example here example request:

{"theoddone":{"id":60783,"name":"theoddone","profileiconid":752,"summonerlevel":30,"revisiondate":1431327360000}} 

theoddone name of object. how make retrofit class dynamically changes name of object depending on person being searched. or how access id property? class looks right not work:

public class summoner {      private int id;     private string name;     private int profileiconid;     private int summonerlevel;     private int revisiondate;      /**      *      * @return      * id      */     public int getid() {         return id;     }      /**      *      * @param id      * id      */     public void setid(int id) {         this.id = id;     }      /**      *      * @return      * name      */     public string getname() {         return name;     }      /**      *      * @param name      * name      */     public void setname(string name) {         this.name = name;     }      /**      *      * @return      * profileiconid      */     public int getprofileiconid() {         return profileiconid;     }      /**      *      * @param profileiconid      * profileiconid      */     public void setprofileiconid(int profileiconid) {         this.profileiconid = profileiconid;     }      /**      *      * @return      * summonerlevel      */     public int getsummonerlevel() {         return summonerlevel;     }      /**      *      * @param summonerlevel      * summonerlevel      */     public void setsummonerlevel(int summonerlevel) {         this.summonerlevel = summonerlevel;     }      /**      *      * @return      * revisiondate      */     public int getrevisiondate() {         return revisiondate;     }      /**      *      * @param revisiondate      * revisiondate      */     public void setrevisiondate(int revisiondate) {         this.revisiondate = revisiondate;     } } 

let me know if need see other part of how using retrofit. in advance.

interface:

public interface summonerid {      @get("/api/lol/{region}/v1.4/summoner/by-name/{summonername}")     void summoner(       @path("region") string region,       @path("summonername") string summonername,       @query("api_key") string apikey,       callback<summoner> cb     );  } 

code in oncreate method of activity:

restadapter restadapter = new restadapter.builder()             .setloglevel(restadapter.loglevel.full)             .setendpoint("https://na.api.pvp.net")             .build();  summonerid service = restadapter.create(summonerid.class);  service.summoner("na", "dyrus", "my api key", new callback<summoner>() {     @override     public void success(summoner summoner, response response) {         //summoner.getid() == null     }      @override     public void failure(retrofiterror error) {      } }); 

when run code connects server , gets right json, not put class.

okay got it. took me long time though.

so first have create custom typeadapterfactory following class:

public class itemtypeadapterfactory implements typeadapterfactory {      string name;      public itemtypeadapterfactory(string name) {         this.name = name;     }      public <t> typeadapter<t> create(gson gson, final typetoken<t> type) {          final typeadapter<t> delegate = gson.getdelegateadapter(this, type);         final typeadapter<jsonelement> elementadapter = gson.getadapter(jsonelement.class);          return new typeadapter<t>() {              public void write(jsonwriter out, t value) throws ioexception {                 delegate.write(out, value);             }              public t read(jsonreader in) throws ioexception {                  jsonelement jsonelement = elementadapter.read(in);                 if (jsonelement.isjsonobject()) {                     jsonobject jsonobject = jsonelement.getasjsonobject();                     if (jsonobject.has(name) && jsonobject.get(name).isjsonobject())                     {                         jsonelement = jsonobject.get(name);                     }                 }                  return delegate.fromjsontree(jsonelement);             }         }.nullsafe();     } } 

for usage can copy , paste please try , understand happens.

next have implement custom gsonbuilder follows:

gson gson = new gsonbuilder().registertypeadapterfactory(new itemtypeadapterfactory("dyrus")).create(); 

the important part "dyrus" can replace name looking for.

next add gsonbuilder restadapter:

restadapter restadapter = new restadapter.builder()                     .setendpoint("your endpoint")                     .setconverter(new gsonconverter(gson))                     .build(); 

use following method in connection interface:

public void getcurrentuser(callback<summoner> response); 

and receive pojo response follows:

    connectioninterface connectioninterface = restadapter.create(**connectioninterface.class**);     connectioninterface.getcurrentuser(new callback<summoner>() {         @override         public void success(summoner response, response response2) {         }          @override         public void failure(retrofiterror error) {             log.e("response", error.getlocalizedmessage().tostring());         }     }); } 

};

your pojo class correct can name want long variables retain names. can call class userpojo clarity , rename instances of summoner userpojo

hope helps!


Comments

Popular posts from this blog

android - MPAndroidChart - How to add Annotations or images to the chart -

javascript - Add class to another page attribute using URL id - Jquery -

firefox - Where is 'webgl.osmesalib' parameter? -