New JsonSerializer source generator overloads

The System.Text.Json source generator feature added new overloads to JsonSerializer that accept pre-generated type information via JsonTypeInfo<T> or JsonSerializerContext. These overloads provide a performance optimization over pre-existing overloads that take JsonSerializerOptions instances and perform run-time reflection. All of these parameter types are reference types for which you can pass null. The following example shows the method-signature patterns for both approaches:

Pre-existing reflection/JsonSerializerOptions-based overloads:

public static string JsonSerializer.Serialize<T>(T value, JsonSerializerOptions? options = null);
public static string JsonSerializer.Serialize(object value, Type type, JsonSerializerOptions? options = null);
public static T JsonSerializer.Deserialize<T>(string json, JsonSerializerOptions? options = null);
public static T JsonSerializer.Deserialize(string json, Type type, JsonSerializerOptions? options = null);

New source-generator/JsonTypeInfo/JsonSerializerContext-based overloads:

public static string JsonSerializer.Serialize<T>(T value, JsonTypeInfo<T> jsonTypeInfo);
public static string JsonSerializer.Serialize(object value, Type type, JsonSerializerContext jsonSerializerContext);
public static T JsonSerializer.Deserialize<T>(string json, JsonTypeInfo<T> jsonTypeInfo);
public static object JsonSerializer.Deserialize(string json, Type type, JsonSerializerContext jsonSerializerContext);

Previous behavior

You could write code that passed null as the value for the JsonSerializerOptions parameter, and it compiled and ran successfully.

entity.Property(e => e.Value).HasConversion(v => JsonSerializer.Serialize(v,null), v => JsonSerializer.Deserialize(v, null));

New behavior

The new source-generator methods in .NET 6 can introduce compiler ambiguity if you pass null for the JsonSerializerOptions parameter. For example, you might see the following error message:

The call is ambiguous between the following methods or properties: 'JsonSerializer.Serialize(TValue, JsonSerializerOptions?)' and 'JsonSerializer.Serialize(TValue, JsonTypeInfo)

Version introduced

.NET 6

Type of breaking change

This change can affect source compatibility.

Reason for change

New overloads were added to the serializer as a performance optimization. For more information, see Try the new System.Text.Json source generator.

Update your code in a manner that disambiguates the intended overload, such as performing an explicit cast to the intended target. For example, you can change the example in the Previous behavior section as follows:

entity.Property(e => e.Value).HasConversion(v => JsonSerializer.Serialize(v, (JsonSerializerOptions)null), v => JsonSerializer.Deserialize(v, (JsonSerializerOptions)null));

Other workarounds include:

  • Omitting the optional parameter JsonSerializerOptions? options = null.
  • Using named arguments.

However, you can't omit optional parameters or use named arguments in a lambda expression.

Affected APIs

All of the System.Text.Json.JsonSerializer methods.