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
Post a Comment