From 7546d5dbebcd9c9808941b0115a2f23198ad2248 Mon Sep 17 00:00:00 2001 From: George Gromov Date: Wed, 19 Mar 2025 12:22:03 +0300 Subject: [PATCH 1/4] added JsonConverterOptions attribute for future customizations and property Hidden to hide a converter from converters settings --- .../Features.meta | 8 +++++ .../Features/HiddenConverterTests.cs | 35 +++++++++++++++++++ .../Features/HiddenConverterTests.cs.meta | 11 ++++++ .../UnityConverters/JsonConverterOptions.cs | 10 ++++++ .../JsonConverterOptions.cs.meta | 11 ++++++ .../UnityConverterInitializer.cs | 9 +++++ 6 files changed, 84 insertions(+) create mode 100644 Assets/Newtonsoft.Json.UnityConverters.Tests/Features.meta create mode 100644 Assets/Newtonsoft.Json.UnityConverters.Tests/Features/HiddenConverterTests.cs create mode 100644 Assets/Newtonsoft.Json.UnityConverters.Tests/Features/HiddenConverterTests.cs.meta create mode 100644 Packages/Newtonsoft.Json-for-Unity.Converters/UnityConverters/JsonConverterOptions.cs create mode 100644 Packages/Newtonsoft.Json-for-Unity.Converters/UnityConverters/JsonConverterOptions.cs.meta diff --git a/Assets/Newtonsoft.Json.UnityConverters.Tests/Features.meta b/Assets/Newtonsoft.Json.UnityConverters.Tests/Features.meta new file mode 100644 index 0000000..1f01250 --- /dev/null +++ b/Assets/Newtonsoft.Json.UnityConverters.Tests/Features.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 7ea707c5c3f72fa44b18e01c4f33c6e9 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Newtonsoft.Json.UnityConverters.Tests/Features/HiddenConverterTests.cs b/Assets/Newtonsoft.Json.UnityConverters.Tests/Features/HiddenConverterTests.cs new file mode 100644 index 0000000..828b57a --- /dev/null +++ b/Assets/Newtonsoft.Json.UnityConverters.Tests/Features/HiddenConverterTests.cs @@ -0,0 +1,35 @@ +using System; +using System.Linq; +using NUnit.Framework; + +namespace Newtonsoft.Json.UnityConverters.Tests +{ + public class HiddenConverterTests + { + [Test] + public void AssertNotRegistered() + { + var hiddenConverterRegistered = UnityConverterInitializer.defaultUnityConvertersSettings.Converters + .Any(x => x.GetType() == typeof(HiddenConverter)); + + Assert.IsFalse(hiddenConverterRegistered, "HiddenConverter registered, but should not."); + } + + + [JsonConverterOptions(Hidden = true)] + internal class HiddenConverter : JsonConverter + { + public override bool CanConvert(Type objectType) => false; + + public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) + { + throw new NotImplementedException(); + } + + public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) + { + throw new NotImplementedException(); + } + } + } +} diff --git a/Assets/Newtonsoft.Json.UnityConverters.Tests/Features/HiddenConverterTests.cs.meta b/Assets/Newtonsoft.Json.UnityConverters.Tests/Features/HiddenConverterTests.cs.meta new file mode 100644 index 0000000..08244a9 --- /dev/null +++ b/Assets/Newtonsoft.Json.UnityConverters.Tests/Features/HiddenConverterTests.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 9068074b3cda1114bac398391d2387cf +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/Newtonsoft.Json-for-Unity.Converters/UnityConverters/JsonConverterOptions.cs b/Packages/Newtonsoft.Json-for-Unity.Converters/UnityConverters/JsonConverterOptions.cs new file mode 100644 index 0000000..6ee9985 --- /dev/null +++ b/Packages/Newtonsoft.Json-for-Unity.Converters/UnityConverters/JsonConverterOptions.cs @@ -0,0 +1,10 @@ +using System; + +namespace Newtonsoft.Json.UnityConverters +{ + [AttributeUsage(AttributeTargets.Class, AllowMultiple = false)] + public class JsonConverterOptionsAttribute : Attribute + { + public bool Hidden { get; set; } + } +} diff --git a/Packages/Newtonsoft.Json-for-Unity.Converters/UnityConverters/JsonConverterOptions.cs.meta b/Packages/Newtonsoft.Json-for-Unity.Converters/UnityConverters/JsonConverterOptions.cs.meta new file mode 100644 index 0000000..6f86b21 --- /dev/null +++ b/Packages/Newtonsoft.Json-for-Unity.Converters/UnityConverters/JsonConverterOptions.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 48f20148200846340bf8902883b32f03 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/Newtonsoft.Json-for-Unity.Converters/UnityConverters/UnityConverterInitializer.cs b/Packages/Newtonsoft.Json-for-Unity.Converters/UnityConverters/UnityConverterInitializer.cs index e73ddcf..eee9932 100644 --- a/Packages/Newtonsoft.Json-for-Unity.Converters/UnityConverters/UnityConverterInitializer.cs +++ b/Packages/Newtonsoft.Json-for-Unity.Converters/UnityConverters/UnityConverterInitializer.cs @@ -26,6 +26,7 @@ using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; using System.Linq; +using System.Reflection; using Newtonsoft.Json.Converters; using Newtonsoft.Json.UnityConverters.Configuration; using Newtonsoft.Json.UnityConverters.Helpers; @@ -195,9 +196,17 @@ private static IEnumerable FilterToJsonConvertersAndOrder(IEnumerable typeof(JsonConverter).IsAssignableFrom(type) && !type.IsAbstract && !type.IsGenericTypeDefinition + && !IsHidden(type) && type.GetConstructor(Array.Empty()) != null ) .OrderBy(type => type.FullName); + + + static bool IsHidden(Type t) + { + var options = t.GetCustomAttribute(); + return options != null && options.Hidden; + } } /// From bae9f9ccec83bb39bcfcfdb082878f4e88fe995f Mon Sep 17 00:00:00 2001 From: George Gromov Date: Thu, 20 Mar 2025 10:17:16 +0300 Subject: [PATCH 2/4] JsonConverterOptions replaced with HideInJsonConverterSettings --- .../Features/HiddenConverterTests.cs | 2 +- ...onverterOptions.cs => HideInJsonConverterSettings.cs} | 5 +---- ...tions.cs.meta => HideInJsonConverterSettings.cs.meta} | 2 +- .../UnityConverters/UnityConverterInitializer.cs | 9 +-------- 4 files changed, 4 insertions(+), 14 deletions(-) rename Packages/Newtonsoft.Json-for-Unity.Converters/UnityConverters/{JsonConverterOptions.cs => HideInJsonConverterSettings.cs} (53%) rename Packages/Newtonsoft.Json-for-Unity.Converters/UnityConverters/{JsonConverterOptions.cs.meta => HideInJsonConverterSettings.cs.meta} (83%) diff --git a/Assets/Newtonsoft.Json.UnityConverters.Tests/Features/HiddenConverterTests.cs b/Assets/Newtonsoft.Json.UnityConverters.Tests/Features/HiddenConverterTests.cs index 828b57a..f73a166 100644 --- a/Assets/Newtonsoft.Json.UnityConverters.Tests/Features/HiddenConverterTests.cs +++ b/Assets/Newtonsoft.Json.UnityConverters.Tests/Features/HiddenConverterTests.cs @@ -16,7 +16,7 @@ public void AssertNotRegistered() } - [JsonConverterOptions(Hidden = true)] + [HideInJsonConverterSettings] internal class HiddenConverter : JsonConverter { public override bool CanConvert(Type objectType) => false; diff --git a/Packages/Newtonsoft.Json-for-Unity.Converters/UnityConverters/JsonConverterOptions.cs b/Packages/Newtonsoft.Json-for-Unity.Converters/UnityConverters/HideInJsonConverterSettings.cs similarity index 53% rename from Packages/Newtonsoft.Json-for-Unity.Converters/UnityConverters/JsonConverterOptions.cs rename to Packages/Newtonsoft.Json-for-Unity.Converters/UnityConverters/HideInJsonConverterSettings.cs index 6ee9985..d8c61ef 100644 --- a/Packages/Newtonsoft.Json-for-Unity.Converters/UnityConverters/JsonConverterOptions.cs +++ b/Packages/Newtonsoft.Json-for-Unity.Converters/UnityConverters/HideInJsonConverterSettings.cs @@ -3,8 +3,5 @@ namespace Newtonsoft.Json.UnityConverters { [AttributeUsage(AttributeTargets.Class, AllowMultiple = false)] - public class JsonConverterOptionsAttribute : Attribute - { - public bool Hidden { get; set; } - } + public class HideInJsonConverterSettings : Attribute { } } diff --git a/Packages/Newtonsoft.Json-for-Unity.Converters/UnityConverters/JsonConverterOptions.cs.meta b/Packages/Newtonsoft.Json-for-Unity.Converters/UnityConverters/HideInJsonConverterSettings.cs.meta similarity index 83% rename from Packages/Newtonsoft.Json-for-Unity.Converters/UnityConverters/JsonConverterOptions.cs.meta rename to Packages/Newtonsoft.Json-for-Unity.Converters/UnityConverters/HideInJsonConverterSettings.cs.meta index 6f86b21..5b44e62 100644 --- a/Packages/Newtonsoft.Json-for-Unity.Converters/UnityConverters/JsonConverterOptions.cs.meta +++ b/Packages/Newtonsoft.Json-for-Unity.Converters/UnityConverters/HideInJsonConverterSettings.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 48f20148200846340bf8902883b32f03 +guid: b9cd605ff4b2fe345bca0ab48417ef23 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Packages/Newtonsoft.Json-for-Unity.Converters/UnityConverters/UnityConverterInitializer.cs b/Packages/Newtonsoft.Json-for-Unity.Converters/UnityConverters/UnityConverterInitializer.cs index eee9932..5692a45 100644 --- a/Packages/Newtonsoft.Json-for-Unity.Converters/UnityConverters/UnityConverterInitializer.cs +++ b/Packages/Newtonsoft.Json-for-Unity.Converters/UnityConverters/UnityConverterInitializer.cs @@ -196,17 +196,10 @@ private static IEnumerable FilterToJsonConvertersAndOrder(IEnumerable typeof(JsonConverter).IsAssignableFrom(type) && !type.IsAbstract && !type.IsGenericTypeDefinition - && !IsHidden(type) + && !type.IsDefined(typeof(HideInJsonConverterSettings)) && type.GetConstructor(Array.Empty()) != null ) .OrderBy(type => type.FullName); - - - static bool IsHidden(Type t) - { - var options = t.GetCustomAttribute(); - return options != null && options.Hidden; - } } /// From 5aca2ee326600420d49b2385ad6b3a9e0c702911 Mon Sep 17 00:00:00 2001 From: George Gromov Date: Thu, 20 Mar 2025 11:14:28 +0300 Subject: [PATCH 3/4] added test case to check availability of "visible" json converter --- .../Features/HiddenConverterTests.cs | 35 ++++++++++++++++--- 1 file changed, 30 insertions(+), 5 deletions(-) diff --git a/Assets/Newtonsoft.Json.UnityConverters.Tests/Features/HiddenConverterTests.cs b/Assets/Newtonsoft.Json.UnityConverters.Tests/Features/HiddenConverterTests.cs index f73a166..5e9fce6 100644 --- a/Assets/Newtonsoft.Json.UnityConverters.Tests/Features/HiddenConverterTests.cs +++ b/Assets/Newtonsoft.Json.UnityConverters.Tests/Features/HiddenConverterTests.cs @@ -7,17 +7,42 @@ namespace Newtonsoft.Json.UnityConverters.Tests public class HiddenConverterTests { [Test] - public void AssertNotRegistered() + public void AssertHiddenConverterNotRegistered() { - var hiddenConverterRegistered = UnityConverterInitializer.defaultUnityConvertersSettings.Converters - .Any(x => x.GetType() == typeof(HiddenConverter)); + var registered = UnityConverterInitializer.defaultUnityConvertersSettings.Converters + .Any(x => x.GetType() == typeof(TestHiddenJsonConverter)); - Assert.IsFalse(hiddenConverterRegistered, "HiddenConverter registered, but should not."); + Assert.IsFalse(registered, "TestHiddenJsonConverter registered, but should not."); + } + + [Test] + public void AssertVisibleConverterRegistered() + { + var registered = UnityConverterInitializer.defaultUnityConvertersSettings.Converters + .Any(x => x.GetType() == typeof(TestVisibleJsonConverter)); + + Assert.IsTrue(registered, "TestVisibleJsonConverter not registered, but should be."); } [HideInJsonConverterSettings] - internal class HiddenConverter : JsonConverter + internal class TestHiddenJsonConverter : JsonConverter + { + public override bool CanConvert(Type objectType) => false; + + public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) + { + throw new NotImplementedException(); + } + + public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) + { + throw new NotImplementedException(); + } + } + + + internal class TestVisibleJsonConverter : JsonConverter { public override bool CanConvert(Type objectType) => false; From 3b01bf21e26636c85e3d92f568f55d5fe25ad192 Mon Sep 17 00:00:00 2001 From: George Gromov Date: Thu, 20 Mar 2025 11:15:17 +0300 Subject: [PATCH 4/4] added summary to HideInJsonConverterSettings (draft) --- .../UnityConverters/HideInJsonConverterSettings.cs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Packages/Newtonsoft.Json-for-Unity.Converters/UnityConverters/HideInJsonConverterSettings.cs b/Packages/Newtonsoft.Json-for-Unity.Converters/UnityConverters/HideInJsonConverterSettings.cs index d8c61ef..f230656 100644 --- a/Packages/Newtonsoft.Json-for-Unity.Converters/UnityConverters/HideInJsonConverterSettings.cs +++ b/Packages/Newtonsoft.Json-for-Unity.Converters/UnityConverters/HideInJsonConverterSettings.cs @@ -2,6 +2,10 @@ namespace Newtonsoft.Json.UnityConverters { + /// + /// The attribute allows to hide JsonConverter from Json.Net converters settings + /// and exclude it from auto sync process. + /// [AttributeUsage(AttributeTargets.Class, AllowMultiple = false)] public class HideInJsonConverterSettings : Attribute { } }