From 672fe601f71faed8d4532a2053e18f7898e14f03 Mon Sep 17 00:00:00 2001 From: Guilherme Werner Date: Mon, 7 Jul 2025 11:06:41 -0300 Subject: [PATCH] Add json serialization configs --- .../BaseClassFirstContractResolver.cs | 20 +++++++++++ .../SerializationConfiguration.cs | 33 +++++++++++++++++++ 2 files changed, 53 insertions(+) create mode 100644 src/Tribufu.Serialization/BaseClassFirstContractResolver.cs create mode 100644 src/Tribufu.Serialization/SerializationConfiguration.cs diff --git a/src/Tribufu.Serialization/BaseClassFirstContractResolver.cs b/src/Tribufu.Serialization/BaseClassFirstContractResolver.cs new file mode 100644 index 0000000..0aa320c --- /dev/null +++ b/src/Tribufu.Serialization/BaseClassFirstContractResolver.cs @@ -0,0 +1,20 @@ +// Copyright (c) Tribufu. All Rights Reserved. +// SPDX-License-Identifier: UNLICENSED + +using Newtonsoft.Json; +using Newtonsoft.Json.Serialization; +using System; +using System.Collections.Generic; +using System.Linq; + +namespace Tribufu.Serialization +{ + public class BaseClassFirstContractResolver : DefaultContractResolver + { + protected override IList CreateProperties(Type type, MemberSerialization memberSerialization) + { + var props = base.CreateProperties(type, memberSerialization); + return props.OrderBy(p => { return p.DeclaringType == type ? 1 : 0; }).ToList(); + } + } +} diff --git a/src/Tribufu.Serialization/SerializationConfiguration.cs b/src/Tribufu.Serialization/SerializationConfiguration.cs new file mode 100644 index 0000000..2eea0d8 --- /dev/null +++ b/src/Tribufu.Serialization/SerializationConfiguration.cs @@ -0,0 +1,33 @@ +// Copyright (c) Tribufu. All Rights Reserved. +// SPDX-License-Identifier: MIT + +using Newtonsoft.Json; +using Newtonsoft.Json.Converters; +using Newtonsoft.Json.Serialization; + +namespace Tribufu.Serialization +{ + public static class SerializationConfiguration + { + public static JsonSerializerSettings GetNewtonsoftJsonSerializerSettings() + { + var settings = new JsonSerializerSettings + { + ContractResolver = new BaseClassFirstContractResolver + { + NamingStrategy = new SnakeCaseNamingStrategy() + }, + }; + + settings.Converters.Add(new DecimalNullableStringConverter()); + settings.Converters.Add(new DecimalStringConverter()); + settings.Converters.Add(new ULongNullableStringConverter()); + settings.Converters.Add(new ULongStringConverter()); + settings.Converters.Add(new StringEnumConverter(new SnakeCaseNamingStrategy(), false)); + + settings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore; + + return settings; + } + } +}