Clean up code following JSON number handling and field support PRs (#39716)
authorLayomi Akinrinade <laakinri@microsoft.com>
Tue, 21 Jul 2020 19:23:03 +0000 (12:23 -0700)
committerGitHub <noreply@github.com>
Tue, 21 Jul 2020 19:23:03 +0000 (12:23 -0700)
* Clean up code following JSON number handling and field support PRs

* Move IsValidNumberHandlingValue to better location

12 files changed:
src/libraries/System.Text.Json/src/Resources/Strings.resx
src/libraries/System.Text.Json/src/System.Text.Json.csproj
src/libraries/System.Text.Json/src/System/Text/Json/Reader/Utf8JsonReader.TryGet.cs
src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Attributes/JsonConverterAttribute.cs
src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Attributes/JsonExtensionDataAttribute.cs
src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Attributes/JsonIncludeAttribute.cs
src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Attributes/JsonNumberHandlingAttribute.cs
src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Converters/Collection/IListConverter.cs
src/libraries/System.Text.Json/src/System/Text/Json/Serialization/JsonNumberHandling.cs
src/libraries/System.Text.Json/src/System/Text/Json/Serialization/JsonSerializer.Read.Helpers.cs
src/libraries/System.Text.Json/src/System/Text/Json/Serialization/JsonSerializer.cs [new file with mode: 0644]
src/libraries/System.Text.Json/tests/Serialization/ExtensionDataTests.cs

index d5db3cf..07655cb 100644 (file)
     <value>Members '{0}' and '{1}' on type '{2}' cannot both bind with parameter '{3}' in constructor '{4}' on deserialization.</value>
   </data>
   <data name="ConstructorParamIncompleteBinding" xml:space="preserve">
-    <value>Each parameter in constructor '{0}' on type '{1}' must bind to an object member on deserialization. Each parameter name must be the camel case equivalent of an object member named with the pascal case naming convention.</value>
+    <value>Each parameter in constructor '{0}' on type '{1}' must bind to an object property or field on deserialization. Each parameter name must match with a property or field on the object. The match can be case-insensitive.</value>
   </data>
   <data name="ConstructorMaxOf64Parameters" xml:space="preserve">
     <value>The constructor '{0}' on type '{1}' may not have more than 64 parameters for deserialization.</value>
   <data name="NumberHandlingOnPropertyTypeMustBeNumberOrCollection" xml:space="preserve">
     <value>When 'JsonNumberHandlingAttribute' is placed on a property or field, the property or field must be a number or a collection. See member '{0}' on type '{1}'.</value>
   </data>
-</root>
\ No newline at end of file
+</root>
index e787def..64d2b05 100644 (file)
     <Compile Include="System\Text\Json\Serialization\JsonPropertyInfo.cs" />
     <Compile Include="System\Text\Json\Serialization\JsonPropertyInfoOfT.cs" />
     <Compile Include="System\Text\Json\Serialization\JsonResumableConverterOfT.cs" />
+    <Compile Include="System\Text\Json\Serialization\JsonSerializer.cs" />
     <Compile Include="System\Text\Json\Serialization\JsonSerializer.Read.HandleMetadata.cs" />
     <Compile Include="System\Text\Json\Serialization\JsonSerializer.Read.HandlePropertyName.cs" />
     <Compile Include="System\Text\Json\Serialization\JsonSerializer.Read.Helpers.cs" />
index d08cbcb..b888bf3 100644 (file)
@@ -977,7 +977,7 @@ namespace System.Text.Json
                 throw ThrowHelper.GetInvalidOperationException_ExpectedNumber(TokenType);
             }
 
-            ReadOnlySpan<byte> span = HasValueSequence ? ValueSequence.ToArray() : ValueSpan;;
+            ReadOnlySpan<byte> span = HasValueSequence ? ValueSequence.ToArray() : ValueSpan;
 
             if (Utf8Parser.TryParse(span, out float tmp, out int bytesConsumed, _numberFormat)
                 && span.Length == bytesConsumed)
index e4248e7..098b1e1 100644 (file)
@@ -12,7 +12,7 @@ namespace System.Text.Json.Serialization
     /// The specified converter type must derive from <see cref="JsonConverter"/>.
     /// When placed on a property or field, the specified converter will always be used.
     /// When placed on a type, the specified converter will be used unless a compatible converter is added to
-    /// <see cref="JsonSerializerOptions.Converters"/> or there is another <see cref="JsonConverterAttribute"/> on a member
+    /// <see cref="JsonSerializerOptions.Converters"/> or there is another <see cref="JsonConverterAttribute"/> on a property or field
     /// of the same type.
     /// </remarks>
     [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Enum | AttributeTargets.Property | AttributeTargets.Field, AllowMultiple = false)]
index 242d50d..194143c 100644 (file)
@@ -16,7 +16,7 @@ namespace System.Text.Json.Serialization
     /// During serializing, the name of the extension data member is not included in the JSON;
     /// the data contained within the extension data is serialized as properties of the JSON object.
     ///
-    /// If there is more than one extension member on a type, or it the member is not of the correct type,
+    /// If there is more than one extension member on a type, or the member is not of the correct type,
     /// an <see cref="InvalidOperationException"/> is thrown during the first serialization or deserialization of that type.
     /// </remarks>
     [AttributeUsage(AttributeTargets.Property | AttributeTargets.Field, AllowMultiple = false)]
index cf5597a..40a6132 100644 (file)
@@ -4,10 +4,13 @@
 namespace System.Text.Json.Serialization
 {
     /// <summary>
-    /// Indicates that the member should be included for serialization and deserialization.
+    /// Indicates that the property or field should be included for serialization and deserialization.
     /// </summary>
     /// <remarks>
-    /// When applied to a property, indicates that non-public getters and setters can be used for serialization and deserialization.
+    /// When applied to a public property, indicates that non-public getters and setters should be used for serialization and deserialization.
+    ///
+    /// Non-public properties and fields are not allowed when serializing and deserializing. If the attribute is used on a non-public property or field,
+    /// an <see cref="InvalidOperationException"/> is thrown during the first serialization or deserialization of the declaring type.
     /// </remarks>
     [AttributeUsage(AttributeTargets.Property | System.AttributeTargets.Field, AllowMultiple = false)]
     public sealed class JsonIncludeAttribute : JsonAttribute
index 581d4aa..ac7661b 100644 (file)
@@ -5,13 +5,13 @@ namespace System.Text.Json.Serialization
 {
     /// <summary>
     /// When placed on a type, property, or field, indicates what <see cref="JsonNumberHandling"/>
-    /// settings should be used when serializing or deserialing numbers.
+    /// settings should be used when serializing or deserializing numbers.
     /// </summary>
     [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Property | AttributeTargets.Field, AllowMultiple = false)]
     public sealed class JsonNumberHandlingAttribute : JsonAttribute
     {
         /// <summary>
-        /// Indicates what settings should be used when serializing or deserialing numbers.
+        /// Indicates what settings should be used when serializing or deserializing numbers.
         /// </summary>
         public JsonNumberHandling Handling { get; }
 
index 09be0bf..0e79173 100644 (file)
@@ -23,9 +23,9 @@ namespace System.Text.Json.Serialization
         /// </summary>
         WriteAsString = 0x2,
         /// <summary>
-        /// The "NaN", "Infinity", and "-Infinity" <see cref="JsonTokenType.String"/> tokens can be read as floating-point constants,
-        /// and the <see cref="float.NaN"/>, <see cref="double.PositiveInfinity"/>, and <see cref="float.NegativeInfinity"/>
-        /// values will be written as their corresponding JSON string representations.
+        /// The "NaN", "Infinity", and "-Infinity" <see cref="JsonTokenType.String"/> tokens can be read as
+        /// floating-point constants, and the <see cref="float"/> and <see cref="double"/> values for these
+        /// constants will be written as their corresponding JSON string representations.
         /// </summary>
         AllowNamedFloatingPointLiterals = 0x4
     }
index 8b01c19..4e79468 100644 (file)
@@ -3,7 +3,6 @@
 
 using System.Diagnostics;
 using System.Diagnostics.CodeAnalysis;
-using System.Runtime.CompilerServices;
 using System.Text.Json.Serialization;
 
 namespace System.Text.Json
@@ -36,11 +35,5 @@ namespace System.Text.Json
             Debug.Assert(value == null || value is TValue);
             return (TValue)value!;
         }
-
-        internal static bool IsValidNumberHandlingValue(JsonNumberHandling handling)
-        {
-            int handlingValue = (int)handling;
-            return handlingValue >= 0 && handlingValue <= 7;
-        }
     }
 }
diff --git a/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/JsonSerializer.cs b/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/JsonSerializer.cs
new file mode 100644 (file)
index 0000000..8ddd013
--- /dev/null
@@ -0,0 +1,15 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System.Text.Json.Serialization;
+
+namespace System.Text.Json
+{
+    public static partial class JsonSerializer
+    {
+        internal static bool IsValidNumberHandlingValue(JsonNumberHandling handling)
+        {
+            return JsonHelpers.IsInRangeInclusive((int)handling, 0, 7);
+        }
+    }
+}
index 8899ef5..a005ec3 100644 (file)
@@ -55,7 +55,7 @@ namespace System.Text.Json.Serialization.Tests
         }
 
         [Fact]
-        public static void ExtensioFieldNotUsed()
+        public static void ExtensionFieldNotUsed()
         {
             string json = @"{""MyNestedClass"":" + SimpleTestClass.s_json + "}";
             ClassWithExtensionField obj = JsonSerializer.Deserialize<ClassWithExtensionField>(json);