public abstract partial class JsonConverterFactory : System.Text.Json.Serialization.JsonConverter
{
protected internal JsonConverterFactory() { }
- protected abstract System.Text.Json.Serialization.JsonConverter CreateConverter(System.Type typeToConvert);
+ public abstract System.Text.Json.Serialization.JsonConverter CreateConverter(System.Type typeToConvert, System.Text.Json.JsonSerializerOptions options);
}
public abstract partial class JsonConverter<T> : System.Text.Json.Serialization.JsonConverter
{
public JsonStringEnumConverter() { }
public JsonStringEnumConverter(System.Text.Json.JsonNamingPolicy namingPolicy = null, bool allowIntegerValues = true) { }
public override bool CanConvert(System.Type typeToConvert) { throw null; }
- protected override System.Text.Json.Serialization.JsonConverter CreateConverter(System.Type typeToConvert) { throw null; }
+ public override System.Text.Json.Serialization.JsonConverter CreateConverter(System.Type typeToConvert, System.Text.Json.JsonSerializerOptions options) { throw null; }
}
}
return type.IsEnum;
}
- protected override JsonConverter CreateConverter(Type type)
+ public override JsonConverter CreateConverter(Type type, JsonSerializerOptions options)
{
JsonConverter converter = (JsonConverter)Activator.CreateInstance(
typeof(JsonConverterEnum<>).MakeGenericType(type),
return (generic == typeof(KeyValuePair<,>));
}
- protected override JsonConverter CreateConverter(Type type)
+ public override JsonConverter CreateConverter(Type type, JsonSerializerOptions options)
{
Type keyType = type.GetGenericArguments()[0];
Type valueType = type.GetGenericArguments()[1];
/// </summary>
protected internal JsonConverterFactory() { }
- internal JsonConverter GetConverterInternal(Type typeToConvert)
+ internal JsonConverter GetConverterInternal(Type typeToConvert, JsonSerializerOptions options)
{
Debug.Assert(CanConvert(typeToConvert));
- return CreateConverter(typeToConvert);
+ return CreateConverter(typeToConvert, options);
}
/// <summary>
/// Create a converter for the provided <see cref="Type"/>.
/// </summary>
- /// <param name="typeToConvert">The type to convert.</param>
+ /// <param name="typeToConvert">The <see cref="Type"/> being converted.</param>
+ /// <param name="options">The <see cref="JsonSerializerOptions"/> being used.</param>
/// <returns>
/// An instance of a <see cref="JsonConverter{T}"/> where T is compatible with <paramref name="typeToConvert"/>.
- /// </returns>
- protected abstract JsonConverter CreateConverter(Type typeToConvert);
+ /// </returns>
+ public abstract JsonConverter CreateConverter(Type typeToConvert, JsonSerializerOptions options);
}
}
if (converter is JsonConverterFactory factory)
{
- converter = factory.GetConverterInternal(runtimePropertyType);
+ converter = factory.GetConverterInternal(runtimePropertyType, this);
}
return converter;
// Allow redirection for generic types or the enum converter.
if (converter is JsonConverterFactory factory)
{
- converter = factory.GetConverterInternal(typeToConvert);
+ converter = factory.GetConverterInternal(typeToConvert, this);
if (converter == null || converter.TypeToConvert == null)
{
throw new ArgumentNullException("typeToConvert");
}
/// <inheritdoc />
- protected override JsonConverter CreateConverter(Type typeToConvert)
+ public override JsonConverter CreateConverter(Type typeToConvert, JsonSerializerOptions options)
{
JsonConverter converter = (JsonConverter)Activator.CreateInstance(
typeof(JsonConverterEnum<>).MakeGenericType(typeToConvert),
return true;
}
- protected override JsonConverter CreateConverter(Type typeToConvert)
+ public override JsonConverter CreateConverter(Type typeToConvert, JsonSerializerOptions options)
{
return null;
}
arg == typeof(long);
}
- protected override JsonConverter CreateConverter(Type type)
+ public override JsonConverter CreateConverter(Type type, JsonSerializerOptions options)
{
Type elementType = type.GetGenericArguments()[0];
string jsonElementString = jsonElement.ToString();
Assert.Equal(expectedJson, jsonElementString);
}
+
+ [Fact]
+ public static void OptionsArePassedToCreateConverter()
+ {
+ TestFactory factory = new TestFactory();
+ JsonSerializerOptions options = new JsonSerializerOptions { Converters = { factory } };
+ string json = JsonSerializer.Serialize("Test", options);
+ Assert.Equal(@"""Test""", json);
+ Assert.Same(options, factory.Options);
+ }
+
+ public class TestFactory : JsonConverterFactory
+ {
+ public JsonSerializerOptions Options { get; private set; }
+
+ public override bool CanConvert(Type typeToConvert) => true;
+
+ public override JsonConverter CreateConverter(Type typeToConvert, JsonSerializerOptions options)
+ {
+ Options = options;
+ return new SimpleConverter();
+ }
+
+ public class SimpleConverter : JsonConverter<string>
+ {
+ public override string Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
+ {
+ throw new NotImplementedException();
+ }
+
+ public override void Write(Utf8JsonWriter writer, string value, JsonSerializerOptions options)
+ => writer.WriteStringValue(value);
+ }
+ }
}
}
Assert.Equal(DayOfWeek.Friday, week.WorkEnd);
Assert.Equal(DayOfWeek.Saturday, week.WeekEnd);
}
+
+ [Fact]
+ public void EnumConverterComposition()
+ {
+ JsonSerializerOptions options = new JsonSerializerOptions { Converters = { new NoFlagsStringEnumConverter() } };
+ string json = JsonSerializer.Serialize(DayOfWeek.Monday, options);
+ Assert.Equal(@"""Monday""", json);
+ json = JsonSerializer.Serialize(FileAccess.Read);
+ Assert.Equal(@"1", json);
+ }
+
+ public class NoFlagsStringEnumConverter : JsonConverterFactory
+ {
+ private static JsonStringEnumConverter s_stringEnumConverter = new JsonStringEnumConverter();
+
+ public override bool CanConvert(Type typeToConvert)
+ => typeToConvert.IsEnum && !typeToConvert.IsDefined(typeof(FlagsAttribute), inherit: false);
+
+ public override JsonConverter CreateConverter(Type typeToConvert, JsonSerializerOptions options)
+ => s_stringEnumConverter.CreateConverter(typeToConvert, options);
+ }
}
}