0

It's not a duplicate as I couldn't find a post explaining why the below happens.

Below is minimal reproducible example that shows MyTypeJsonConverter never gets called when used with ItemConverterType. But, it does get called when passed to DeserializeObject. Why?

MyTypeJsonConverter does NOT get called

public class MyData
{
    [JsonProperty("type", ItemConverterType = typeof(MyTypeJsonConverter))]
    public MyType MyType { get; set; }
}

static void foo()
{
    var json = "{\"type\":\"data\"}";
    var obj = JsonConvert.DeserializeObject<MyType>(json);
}

MyTypeJsonConverter does get called

public class MyData
{
    [JsonProperty("type")]
    public MyType MyType { get; set; }
}

static void foo()
{
    var json = "{\"type\":\"data\"}";
    var obj = JsonConvert.DeserializeObject<MyType>(json, new MyTypeJsonConverter());
}

MyTypeJsonConverter

public class MyTypeJsonConverter : JsonConverter<MyType>
{
    public override MyType ReadJson(JsonReader reader, Type objectType, MyType existingValue, bool hasExistingValue, Newtonsoft.Json.JsonSerializer serializer)
    {
        return new MyType();
    }

    public override void WriteJson(JsonWriter writer, MyType value, Newtonsoft.Json.JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }
}
theateist
  • 13,879
  • 17
  • 69
  • 109
  • 1
    I would think "item" means something like "list item", doesn't it? Edit: yep, looks like it - https://www.newtonsoft.com/json/help/html/P_Newtonsoft_Json_JsonPropertyAttribute_ItemConverterType.htm _"Gets or sets the JsonConverter type used when serializing the **property's collection items.**"_ – ProgrammingLlama Jan 27 '23 at 07:29
  • 1
    [`ItemConverterType`](https://www.newtonsoft.com/json/help/html/P_Newtonsoft_Json_JsonPropertyAttribute_ItemConverterType.htm) is for **collection items**. Use `[JsonConverter(typeof(MyTypeJsonConverter))]`. – dbc Jan 27 '23 at 08:47

0 Answers0