diff --git a/src/RestClient/RestClient/src/ClickView.Extensions.RestClient.csproj b/src/RestClient/RestClient/src/ClickView.Extensions.RestClient.csproj index c95a594..f22e300 100644 --- a/src/RestClient/RestClient/src/ClickView.Extensions.RestClient.csproj +++ b/src/RestClient/RestClient/src/ClickView.Extensions.RestClient.csproj @@ -9,6 +9,7 @@ + diff --git a/src/RestClient/RestClient/src/Serialization/SystemTextJsonSerializer.cs b/src/RestClient/RestClient/src/Serialization/SystemTextJsonSerializer.cs new file mode 100644 index 0000000..7388b87 --- /dev/null +++ b/src/RestClient/RestClient/src/Serialization/SystemTextJsonSerializer.cs @@ -0,0 +1,52 @@ +namespace ClickView.Extensions.RestClient.Serialization; + +using System.Text.Json; +using System.Text.Json.Serialization; + +public class SystemTextJsonSerializer(JsonSerializerOptions options) : ISerializer +{ + public static readonly ISerializer Default = new SystemTextJsonSerializer(); + + public SystemTextJsonSerializer() : this(GetDefaultOptions()) + { + } + + public static JsonSerializerOptions GetDefaultOptions() + { + return new JsonSerializerOptions + { + // Same defaults as JsonSerializerDefaults.Web + PropertyNameCaseInsensitive = true, + PropertyNamingPolicy = JsonNamingPolicy.CamelCase, + NumberHandling = JsonNumberHandling.AllowReadingFromString + }; + } + + public string Serialize(object obj) + { + return JsonSerializer.Serialize(obj, options); + } + + public T? Deserialize(string input) + { + if (input is null) + throw new ArgumentNullException(nameof(input)); + + return JsonSerializer.Deserialize(input, options); + } + + public object? Deserialize(string input, Type type) + { + if (input is null) + throw new ArgumentNullException(nameof(input)); + + return JsonSerializer.Deserialize(input, type, options); + } + + public ValueTask DeserializeAsync(Stream stream, CancellationToken cancellationToken = default) + { + return JsonSerializer.DeserializeAsync(stream, options, cancellationToken); + } + + public string Format => "json"; +}