public interface ISerializer
{
string Serialize<T>(T obj);
T Deserialize<T>(string json);
}
public class SystemTextJsonSerializer : ISerializer
{
private readonly JsonSerializerOptions _options;
public SystemTextJsonSerializer(JsonSerializerOptions options)
{
_options = options;
}
public string Serialize<T>(T obj)
{
return JsonSerializer.Serialize(obj, _options);
}
public T Deserialize<T>(string json)
{
return JsonSerializer.Deserialize<T>(json, _options)!;
}
}
public class NewtonsoftJsonSerializer : ISerializer
{
private readonly JsonSerializerSettings _settings;
public NewtonsoftJsonSerializer(JsonSerializerSettings settings)
{
_settings = settings;
}
public string Serialize<T>(T obj)
{
return JsonConvert.SerializeObject(obj, _settings);
}
public T Deserialize<T>(string json)
{
return JsonConvert.DeserializeObject<T>(json, _settings)!;
}
}
DI registration
builder.Services.AddSingleton<ISerializer>(sp =>
{
var options = new JsonSerializerOptions
{
PropertyNamingPolicy = JsonNamingPolicy.SnakeCaseLower
};
return new SystemTextJsonSerializer(options);
});
builder.Services.AddControllers()
.AddJsonOptions(options =>
{
options.JsonSerializerOptions.PropertyNamingPolicy =
JsonNamingPolicy.CamelCase;
});
Or add a static wrapper like we do with Logger
Serialiser.Initialise(new SystemTextJsonSerializer());
DI registration
Or add a static wrapper like we do with Logger