c# - Deserializing descendent objects -
i'm communicating json-based api can't change. returns response object varying result object inside. typically looks this:
{ "ver": "2.0", "result": { "code": 0 } }
for commands result object 'grown' adding properties:
{ "ver": "2.0", "result": { "code": 0, "hostname": "sample", "hostport": 5000 } }
i've used newtonsoft attributes define objects follows:
internal class rpcresponse { [jsonproperty(propertyname = "ver")] public string version { get; set; } [jsonproperty(propertyname = "result")] public rpcresponseresult result { get; set; } internal class rpcresponseresult { [jsonproperty(propertyname = "code")] public int code { get; set; } } internal class rpcextendedresponseresult: rpcresponseresult { [jsonproperty(propertyname = "hostname")] public string hostname { get; set; } [jsonproperty(propertyname = "hostport")] public int hostport { get; set; }
but when response object deserialized:
rpcresponse rspresponse = jsonconvert.deserializeobject<rpcresponse>(rspstring);
its result property appears rpcresponseresult object, ie. jsonconvert doesn't know construct rpcextendedresponseresult object.
is there way attributes or converters reinstate correct descendent object? feel i'm missing obvious!
it's because type of object rpcresponseresult. deserializer can deserialize fields declared in type of field specified. can't determine because class has "hostname" rpcextendedresponseresult.
if doing this, might make result container possible fields default values if needed, , can fill object needed.
internal class rpcresponseresultcontainer { [jsonproperty(propertyname = "code")] public int code { get; set; } [jsonproperty(propertyname = "hostname")] private string mhostname = string.empty; public string hostname { { return mhostname;} set { mhostname = value; } } [jsonproperty(propertyname = "hostport")] private int mhostport = -1; public int hostport { { return mhostport;} set { mhostport = value;} }
then if really wanted object want it, in container class:
public rpcresponseresult getactualresponsetype() { if(hostport != -1 && !string.isnulloremtpy(hostname)) { return new rpcextendedresponseresult() { code = this.code, hostname = this.hostname, hostport = this.hostport}; } return new rpcresponseresult() { code = this.code }; }
Comments
Post a Comment