Custom Deserialization using Json.NET
Solution 1
I just resolve my problem using JsonConverter
as I mentioned above in my question. Below my complete code:
public class Order
{
public int Id { get; set; }
[JsonConverter(typeof(ShippingMethodConverter))]
public string ShippingMethod { get; set; }
}
public class ShippingMethodConverter : JsonConverter
{
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
throw new NotImplementedException("Not implemented yet");
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
if (reader.TokenType == JsonToken.Null)
{
return string.Empty;
}
else if (reader.TokenType == JsonToken.String)
{
return serializer.Deserialize(reader, objectType);
}
else
{
JObject obj = JObject.Load(reader);
if (obj["Code"] != null)
return obj["Code"].ToString();
else
return serializer.Deserialize(reader, objectType);
}
}
public override bool CanWrite
{
get { return false; }
}
public override bool CanConvert(Type objectType)
{
return false;
}
}
Solution 2
dynamic o = JsonConvert.DeserializeObject(json);
var order = new Order
{
Id = o.Id,
ShippingMethod = o.ShippingMethod.Code
};
Deserialize the object as dynamic and then fill the Order
object by accessing to the dynamic object properties
Solution 3
You can use JsonProperty
and JsonIgnore
attributes to direct the deserialization process... So your model can be:
public class Order
{
public int Id { get; set; }
[JsonIgnore]
public string ShippingMethod
{
get
{
return (string)TempShippingMethod?["Code"];
}
}
[JsonProperty("ShippingMethod")]
private JObject TempShippingMethod { set; get; }
}
var res = JsonConvert.DeserializeObject<Order>(json);
Habibillah
I work as independent developer at https://kalicode.com/. Also you can contact me at:
Updated on December 03, 2020Comments
-
Habibillah over 3 years
I have a class
public class Order { public int Id { get; set; } public string ShippingMethod { get; set; } }
and I want to deserialize a JSON data below into the above class/object
string json = @"{ 'Id': 1, 'ShippingMethod': { 'Code': 'external_DHLExpressWorldwide', 'Description': 'DHL ILS Express Worldwide' } }";
My idea is that
ShippingMethod
in JSON is a object, but I just want to get toShippingMethod.Code
(in JSON) that will pass intoShippingMethod
asstring
inOrder
class during deserialization.how can I accomplish that goal using Json.NET?
I believe I can accomlish it using CustomJsonConverter. But I get confused. The example in the docs just for
WriteJson
, but notReadJson
.