I have the input JSON
{"QtyEqualsQtyWorked":0,"ReasonCode":"IN"}
and my class is
public class LoadForMovementOpt
{
public bool QtyEqualsQtyWorked { get; set; }
public string[] ReasonCode { get; set; }
}
The property ReasonCode
has to be array for some reasons I cannot argue with, but in json it can be both string and string[]. So I wrote a custom converter that actually works, but maybe it can improved:
class LoadForMovementConverter : JsonConverter
{
public override bool CanConvert(Type objectType) { return true; }
public override bool CanWrite
{
get
{
return false;
}
}
public override bool CanRead
{
get
{
return true;
}
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { }
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
JToken token = JToken.Load(reader);
var reasonToken = token["ReasonCode"];
if(reasonToken == null)
{
return token.ToObject(objectType);
}
if(reasonToken.Type == JTokenType.Array)
{
return token.ToObject(objectType);
}
else
{
var QtyEqualsQtyWorkedToken = token["QtyEqualsQtyWorked"];
return
new LoadForMovementOpt
{
QtyEqualsQtyWorked =
QtyEqualsQtyWorkedToken
.ToObject<bool>(),
ReasonCode =
new string[]
{
reasonToken.ToObject<string>()
}
};
}
}
}
Is there any way to improve it?
reasonToken.Type == JTokenType.Array
that you can also have a json that contains an array, this is, both cases can occur? \$\endgroup\$ – t3chb0t Feb 7 '18 at 12:56