Custom Deserialization using Json.NET

33,589

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);
Share:
33,589
Habibillah
Author by

Habibillah

I work as independent developer at https://kalicode.com/. Also you can contact me at:

Updated on December 03, 2020

Comments

  • Habibillah
    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 to ShippingMethod.Code (in JSON) that will pass into ShippingMethod as string in Order 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 not ReadJson.