Skip to content

Commit

Permalink
add system text json serializer
Browse files Browse the repository at this point in the history
  • Loading branch information
vendyp committed Jan 18, 2024
1 parent 42df200 commit e9fff0e
Show file tree
Hide file tree
Showing 4 changed files with 102 additions and 0 deletions.
29 changes: 29 additions & 0 deletions src/MyLib.Infrastructure/Serialization/DateOnlyConverter.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
using System.Text.Json;
using System.Text.Json.Serialization;

namespace MyLib.Infrastructure.Serialization;

public sealed class DateOnlyConverter : JsonConverter<DateOnly>
{
private readonly string _serializationFormat;

public DateOnlyConverter() : this(null)
{
}

public DateOnlyConverter(string? serializationFormat)
{
_serializationFormat = serializationFormat ?? "yyyy-MM-dd";
}

public override DateOnly Read(ref Utf8JsonReader reader,
Type typeToConvert, JsonSerializerOptions options)
{
var value = reader.GetString();
return DateOnly.Parse(value!);
}

public override void Write(Utf8JsonWriter writer, DateOnly value,
JsonSerializerOptions options)
=> writer.WriteStringValue(value.ToString(_serializationFormat));
}
26 changes: 26 additions & 0 deletions src/MyLib.Infrastructure/Serialization/SystemTextJsonSerializer.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
using System.Text.Json;
using System.Text.Json.Serialization;
using MyLib.Abstractions.Serialization;

namespace MyLib.Infrastructure.Serialization;

internal sealed class SystemTextJsonSerializer : IJsonSerializer
{
private readonly JsonSerializerOptions _options;

public SystemTextJsonSerializer(JsonSerializerOptions? options = null)
{
_options = options ?? new()
{
PropertyNameCaseInsensitive = true,
PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
Converters = { new JsonStringEnumConverter(), new DateOnlyConverter(), new TimeOnlyConverter() }
};
}

public string Serialize<T>(T value) => JsonSerializer.Serialize(value, _options);

public T? Deserialize<T>(string value) => JsonSerializer.Deserialize<T>(value, _options);

public object? Deserialize(string value, Type type) => JsonSerializer.Deserialize(value, type, _options);
}
29 changes: 29 additions & 0 deletions src/MyLib.Infrastructure/Serialization/TimeOnlyConverter.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
using System.Text.Json;
using System.Text.Json.Serialization;

namespace MyLib.Infrastructure.Serialization;

public sealed class TimeOnlyConverter : JsonConverter<TimeOnly>
{
private readonly string _serializationFormat;

public TimeOnlyConverter() : this(null)
{
}

public TimeOnlyConverter(string? serializationFormat)
{
_serializationFormat = serializationFormat ?? "HH:mm:ss.fff";
}

public override TimeOnly Read(ref Utf8JsonReader reader,
Type typeToConvert, JsonSerializerOptions options)
{
var value = reader.GetString();
return TimeOnly.Parse(value!);
}

public override void Write(Utf8JsonWriter writer, TimeOnly value,
JsonSerializerOptions options)
=> writer.WriteStringValue(value.ToString(_serializationFormat));
}
18 changes: 18 additions & 0 deletions tests/MyLib.Tests/Serialization/SystemTextJsonSerializerTests.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
using MyLib.Infrastructure.Serialization;
using Shouldly;

namespace MyLib.Tests.Serialization;

public class SystemTextJsonSerializerTests
{
[Fact]
public void SystemTextJsonSerializer_Test_Serialize()
{
string expectedResult = @"{""id"":""1"",""name"":""test""}";

var service = new SystemTextJsonSerializer();
var result = service.Serialize(new { id = "1", name = "test" });

expectedResult.ShouldBe(result);
}
}

0 comments on commit e9fff0e

Please sign in to comment.