RSCG – System.Text.Json
name | System.Text.Json |
nuget | https://www.nuget.org/packages/System.Text.Json/ |
link | https://learn.microsoft.com/en-us/dotnet/standard/serialization/system-text-json/source-generation |
author | Microsoft |
Json Serialize without reflection
This is how you can use System.Text.Json .
The code that you start with is
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <OutputType>Exe</OutputType> <TargetFramework>net7.0</TargetFramework> <ImplicitUsings>enable</ImplicitUsings> <Nullable>enable</Nullable> </PropertyGroup> <PropertyGroup> <EmitCompilerGeneratedFiles>true</EmitCompilerGeneratedFiles> <CompilerGeneratedFilesOutputPath>$(BaseIntermediateOutputPath)\GeneratedX</CompilerGeneratedFilesOutputPath> </PropertyGroup> </Project>
The code that you will use is
using JsonSerializerOptionsExample; using System.Text.Json; //for asp.net core //services.AddControllers().AddJsonOptions(options => options.JsonSerializerOptions.AddContext<MyJsonContext>()); //https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/tokens/raw-string string jsonString =""" { "date": "2019-08-01T00:00:00", "temperatureCelsius": 25, "summary": "Hot" } """; WeatherForecast? weatherForecast= JsonSerializer.Deserialize( jsonString, typeof(WeatherForecast), new OptionsExampleContext( new JsonSerializerOptions(JsonSerializerDefaults.Web))) as WeatherForecast; Console.WriteLine($"Date={weatherForecast?.Date}"); // output: //Date=8/1/2019 12:00:00 AM jsonString = JsonSerializer.Serialize( weatherForecast, typeof(WeatherForecast), new OptionsExampleContext( new JsonSerializerOptions(JsonSerializerDefaults.Web))); Console.WriteLine(jsonString); jsonString = JsonSerializer.Serialize( weatherForecast, typeof(WeatherForecast), new OptionsExampleContext( new JsonSerializerOptions(JsonSerializerDefaults.General))); Console.WriteLine(jsonString); // output: //{ "date":"2019-08-01T00:00:00","temperatureCelsius":25,"summary":"Hot"}
namespace JsonSerializerOptionsExample; public class WeatherForecast { public DateTime Date { get; set; } public int TemperatureCelsius { get; set; } public string? Summary { get; set; } }
using System.Text.Json.Serialization; namespace JsonSerializerOptionsExample; [JsonSerializable(typeof(WeatherForecast))] internal partial class OptionsExampleContext : JsonSerializerContext { }
The code that is generated is
// <auto-generated/> #nullable enable annotations #nullable disable warnings // Suppress warnings about [Obsolete] member usage in generated code. #pragma warning disable CS0618 namespace JsonSerializerOptionsExample { internal partial class OptionsExampleContext { private global::System.Text.Json.Serialization.Metadata.JsonTypeInfo<global::System.DateTime>? _DateTime; /// <summary> /// Defines the source generated JSON serialization contract metadata for a given type. /// </summary> public global::System.Text.Json.Serialization.Metadata.JsonTypeInfo<global::System.DateTime> DateTime { get => _DateTime ??= Create_DateTime(Options, makeReadOnly: true); } private global::System.Text.Json.Serialization.Metadata.JsonTypeInfo<global::System.DateTime> Create_DateTime(global::System.Text.Json.JsonSerializerOptions options, bool makeReadOnly) { global::System.Text.Json.Serialization.Metadata.JsonTypeInfo<global::System.DateTime>? jsonTypeInfo = null; global::System.Text.Json.Serialization.JsonConverter? customConverter; if (options.Converters.Count > 0 && (customConverter = GetRuntimeProvidedCustomConverter(options, typeof(global::System.DateTime))) != null) { jsonTypeInfo = global::System.Text.Json.Serialization.Metadata.JsonMetadataServices.CreateValueInfo<global::System.DateTime>(options, customConverter); } else { jsonTypeInfo = global::System.Text.Json.Serialization.Metadata.JsonMetadataServices.CreateValueInfo<global::System.DateTime>(options, global::System.Text.Json.Serialization.Metadata.JsonMetadataServices.DateTimeConverter); } if (makeReadOnly) { jsonTypeInfo.MakeReadOnly(); } return jsonTypeInfo; } } }
// <auto-generated/> #nullable enable annotations #nullable disable warnings // Suppress warnings about [Obsolete] member usage in generated code. #pragma warning disable CS0618 namespace JsonSerializerOptionsExample { [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Text.Json.SourceGeneration", "7.0.8.17405")] internal partial class OptionsExampleContext { private static global::System.Text.Json.JsonSerializerOptions s_defaultOptions { get; } = new global::System.Text.Json.JsonSerializerOptions() { DefaultIgnoreCondition = global::System.Text.Json.Serialization.JsonIgnoreCondition.Never, IgnoreReadOnlyFields = false, IgnoreReadOnlyProperties = false, IncludeFields = false, WriteIndented = false, }; private static global::JsonSerializerOptionsExample.OptionsExampleContext? s_defaultContext; /// <summary> /// The default <see cref="global::System.Text.Json.Serialization.JsonSerializerContext"/> associated with a default <see cref="global::System.Text.Json.JsonSerializerOptions"/> instance. /// </summary> public static global::JsonSerializerOptionsExample.OptionsExampleContext Default => s_defaultContext ??= new global::JsonSerializerOptionsExample.OptionsExampleContext(new global::System.Text.Json.JsonSerializerOptions(s_defaultOptions)); /// <summary> /// The source-generated options associated with this context. /// </summary> protected override global::System.Text.Json.JsonSerializerOptions? GeneratedSerializerOptions { get; } = s_defaultOptions; /// <inheritdoc/> public OptionsExampleContext() : base(null) { } /// <inheritdoc/> public OptionsExampleContext(global::System.Text.Json.JsonSerializerOptions options) : base(options) { } private static global::System.Text.Json.Serialization.JsonConverter? GetRuntimeProvidedCustomConverter(global::System.Text.Json.JsonSerializerOptions options, global::System.Type type) { global::System.Collections.Generic.IList<global::System.Text.Json.Serialization.JsonConverter> converters = options.Converters; for (int i = 0; i < converters.Count; i++) { global::System.Text.Json.Serialization.JsonConverter? converter = converters[i]; if (converter.CanConvert(type)) { if (converter is global::System.Text.Json.Serialization.JsonConverterFactory factory) { converter = factory.CreateConverter(type, options); if (converter == null || converter is global::System.Text.Json.Serialization.JsonConverterFactory) { throw new global::System.InvalidOperationException(string.Format("The converter '{0}' cannot return null or a JsonConverterFactory instance.", factory.GetType())); } } return converter; } } return null; } } }
// <auto-generated/> #nullable enable annotations #nullable disable warnings // Suppress warnings about [Obsolete] member usage in generated code. #pragma warning disable CS0618 namespace JsonSerializerOptionsExample { internal partial class OptionsExampleContext: global::System.Text.Json.Serialization.Metadata.IJsonTypeInfoResolver { /// <inheritdoc/> public override global::System.Text.Json.Serialization.Metadata.JsonTypeInfo GetTypeInfo(global::System.Type type) { if (type == typeof(global::JsonSerializerOptionsExample.WeatherForecast)) { return this.WeatherForecast; } if (type == typeof(global::System.DateTime)) { return this.DateTime; } if (type == typeof(global::System.Int32)) { return this.Int32; } if (type == typeof(global::System.String)) { return this.String; } return null!; } global::System.Text.Json.Serialization.Metadata.JsonTypeInfo? global::System.Text.Json.Serialization.Metadata.IJsonTypeInfoResolver.GetTypeInfo(global::System.Type type, global::System.Text.Json.JsonSerializerOptions options) { if (type == typeof(global::JsonSerializerOptionsExample.WeatherForecast)) { return Create_WeatherForecast(options, makeReadOnly: false); } if (type == typeof(global::System.DateTime)) { return Create_DateTime(options, makeReadOnly: false); } if (type == typeof(global::System.Int32)) { return Create_Int32(options, makeReadOnly: false); } if (type == typeof(global::System.String)) { return Create_String(options, makeReadOnly: false); } return null; } } }
// <auto-generated/> #nullable enable annotations #nullable disable warnings // Suppress warnings about [Obsolete] member usage in generated code. #pragma warning disable CS0618 namespace JsonSerializerOptionsExample { internal partial class OptionsExampleContext { private global::System.Text.Json.Serialization.Metadata.JsonTypeInfo<global::System.Int32>? _Int32; /// <summary> /// Defines the source generated JSON serialization contract metadata for a given type. /// </summary> public global::System.Text.Json.Serialization.Metadata.JsonTypeInfo<global::System.Int32> Int32 { get => _Int32 ??= Create_Int32(Options, makeReadOnly: true); } private global::System.Text.Json.Serialization.Metadata.JsonTypeInfo<global::System.Int32> Create_Int32(global::System.Text.Json.JsonSerializerOptions options, bool makeReadOnly) { global::System.Text.Json.Serialization.Metadata.JsonTypeInfo<global::System.Int32>? jsonTypeInfo = null; global::System.Text.Json.Serialization.JsonConverter? customConverter; if (options.Converters.Count > 0 && (customConverter = GetRuntimeProvidedCustomConverter(options, typeof(global::System.Int32))) != null) { jsonTypeInfo = global::System.Text.Json.Serialization.Metadata.JsonMetadataServices.CreateValueInfo<global::System.Int32>(options, customConverter); } else { jsonTypeInfo = global::System.Text.Json.Serialization.Metadata.JsonMetadataServices.CreateValueInfo<global::System.Int32>(options, global::System.Text.Json.Serialization.Metadata.JsonMetadataServices.Int32Converter); } if (makeReadOnly) { jsonTypeInfo.MakeReadOnly(); } return jsonTypeInfo; } } }
// <auto-generated/> #nullable enable annotations #nullable disable warnings // Suppress warnings about [Obsolete] member usage in generated code. #pragma warning disable CS0618 namespace JsonSerializerOptionsExample { internal partial class OptionsExampleContext { private static readonly global::System.Text.Json.JsonEncodedText PropName_Date = global::System.Text.Json.JsonEncodedText.Encode("Date"); private static readonly global::System.Text.Json.JsonEncodedText PropName_TemperatureCelsius = global::System.Text.Json.JsonEncodedText.Encode("TemperatureCelsius"); private static readonly global::System.Text.Json.JsonEncodedText PropName_Summary = global::System.Text.Json.JsonEncodedText.Encode("Summary"); } }
// <auto-generated/> #nullable enable annotations #nullable disable warnings // Suppress warnings about [Obsolete] member usage in generated code. #pragma warning disable CS0618 namespace JsonSerializerOptionsExample { internal partial class OptionsExampleContext { private global::System.Text.Json.Serialization.Metadata.JsonTypeInfo<global::System.String>? _String; /// <summary> /// Defines the source generated JSON serialization contract metadata for a given type. /// </summary> public global::System.Text.Json.Serialization.Metadata.JsonTypeInfo<global::System.String> String { get => _String ??= Create_String(Options, makeReadOnly: true); } private global::System.Text.Json.Serialization.Metadata.JsonTypeInfo<global::System.String> Create_String(global::System.Text.Json.JsonSerializerOptions options, bool makeReadOnly) { global::System.Text.Json.Serialization.Metadata.JsonTypeInfo<global::System.String>? jsonTypeInfo = null; global::System.Text.Json.Serialization.JsonConverter? customConverter; if (options.Converters.Count > 0 && (customConverter = GetRuntimeProvidedCustomConverter(options, typeof(global::System.String))) != null) { jsonTypeInfo = global::System.Text.Json.Serialization.Metadata.JsonMetadataServices.CreateValueInfo<global::System.String>(options, customConverter); } else { jsonTypeInfo = global::System.Text.Json.Serialization.Metadata.JsonMetadataServices.CreateValueInfo<global::System.String>(options, global::System.Text.Json.Serialization.Metadata.JsonMetadataServices.StringConverter); } if (makeReadOnly) { jsonTypeInfo.MakeReadOnly(); } return jsonTypeInfo; } } }
// <auto-generated/> #nullable enable annotations #nullable disable warnings // Suppress warnings about [Obsolete] member usage in generated code. #pragma warning disable CS0618 namespace JsonSerializerOptionsExample { internal partial class OptionsExampleContext { private global::System.Text.Json.Serialization.Metadata.JsonTypeInfo<global::JsonSerializerOptionsExample.WeatherForecast>? _WeatherForecast; /// <summary> /// Defines the source generated JSON serialization contract metadata for a given type. /// </summary> public global::System.Text.Json.Serialization.Metadata.JsonTypeInfo<global::JsonSerializerOptionsExample.WeatherForecast> WeatherForecast { get => _WeatherForecast ??= Create_WeatherForecast(Options, makeReadOnly: true); } private global::System.Text.Json.Serialization.Metadata.JsonTypeInfo<global::JsonSerializerOptionsExample.WeatherForecast> Create_WeatherForecast(global::System.Text.Json.JsonSerializerOptions options, bool makeReadOnly) { global::System.Text.Json.Serialization.Metadata.JsonTypeInfo<global::JsonSerializerOptionsExample.WeatherForecast>? jsonTypeInfo = null; global::System.Text.Json.Serialization.JsonConverter? customConverter; if (options.Converters.Count > 0 && (customConverter = GetRuntimeProvidedCustomConverter(options, typeof(global::JsonSerializerOptionsExample.WeatherForecast))) != null) { jsonTypeInfo = global::System.Text.Json.Serialization.Metadata.JsonMetadataServices.CreateValueInfo<global::JsonSerializerOptionsExample.WeatherForecast>(options, customConverter); } else { global::System.Text.Json.Serialization.Metadata.JsonObjectInfoValues<global::JsonSerializerOptionsExample.WeatherForecast> objectInfo = new global::System.Text.Json.Serialization.Metadata.JsonObjectInfoValues<global::JsonSerializerOptionsExample.WeatherForecast>() { ObjectCreator = static () => new global::JsonSerializerOptionsExample.WeatherForecast(), ObjectWithParameterizedConstructorCreator = null, PropertyMetadataInitializer = _ => WeatherForecastPropInit(options), ConstructorParameterMetadataInitializer = null, NumberHandling = default, SerializeHandler = WeatherForecastSerializeHandler }; jsonTypeInfo = global::System.Text.Json.Serialization.Metadata.JsonMetadataServices.CreateObjectInfo<global::JsonSerializerOptionsExample.WeatherForecast>(options, objectInfo); } if (makeReadOnly) { jsonTypeInfo.MakeReadOnly(); } return jsonTypeInfo; } private static global::System.Text.Json.Serialization.Metadata.JsonPropertyInfo[] WeatherForecastPropInit(global::System.Text.Json.JsonSerializerOptions options) { global::System.Text.Json.Serialization.Metadata.JsonPropertyInfo[] properties = new global::System.Text.Json.Serialization.Metadata.JsonPropertyInfo[3]; global::System.Text.Json.Serialization.Metadata.JsonPropertyInfoValues<global::System.DateTime> info0 = new global::System.Text.Json.Serialization.Metadata.JsonPropertyInfoValues<global::System.DateTime>() { IsProperty = true, IsPublic = true, IsVirtual = false, DeclaringType = typeof(global::JsonSerializerOptionsExample.WeatherForecast), Converter = null, Getter = static (obj) => ((global::JsonSerializerOptionsExample.WeatherForecast)obj).Date, Setter = static (obj, value) => ((global::JsonSerializerOptionsExample.WeatherForecast)obj).Date = value!, IgnoreCondition = null, HasJsonInclude = false, IsExtensionData = false, NumberHandling = default, PropertyName = "Date", JsonPropertyName = null }; global::System.Text.Json.Serialization.Metadata.JsonPropertyInfo propertyInfo0 = global::System.Text.Json.Serialization.Metadata.JsonMetadataServices.CreatePropertyInfo<global::System.DateTime>(options, info0); properties[0] = propertyInfo0; global::System.Text.Json.Serialization.Metadata.JsonPropertyInfoValues<global::System.Int32> info1 = new global::System.Text.Json.Serialization.Metadata.JsonPropertyInfoValues<global::System.Int32>() { IsProperty = true, IsPublic = true, IsVirtual = false, DeclaringType = typeof(global::JsonSerializerOptionsExample.WeatherForecast), Converter = null, Getter = static (obj) => ((global::JsonSerializerOptionsExample.WeatherForecast)obj).TemperatureCelsius, Setter = static (obj, value) => ((global::JsonSerializerOptionsExample.WeatherForecast)obj).TemperatureCelsius = value!, IgnoreCondition = null, HasJsonInclude = false, IsExtensionData = false, NumberHandling = default, PropertyName = "TemperatureCelsius", JsonPropertyName = null }; global::System.Text.Json.Serialization.Metadata.JsonPropertyInfo propertyInfo1 = global::System.Text.Json.Serialization.Metadata.JsonMetadataServices.CreatePropertyInfo<global::System.Int32>(options, info1); properties[1] = propertyInfo1; global::System.Text.Json.Serialization.Metadata.JsonPropertyInfoValues<global::System.String> info2 = new global::System.Text.Json.Serialization.Metadata.JsonPropertyInfoValues<global::System.String>() { IsProperty = true, IsPublic = true, IsVirtual = false, DeclaringType = typeof(global::JsonSerializerOptionsExample.WeatherForecast), Converter = null, Getter = static (obj) => ((global::JsonSerializerOptionsExample.WeatherForecast)obj).Summary!, Setter = static (obj, value) => ((global::JsonSerializerOptionsExample.WeatherForecast)obj).Summary = value!, IgnoreCondition = null, HasJsonInclude = false, IsExtensionData = false, NumberHandling = default, PropertyName = "Summary", JsonPropertyName = null }; global::System.Text.Json.Serialization.Metadata.JsonPropertyInfo propertyInfo2 = global::System.Text.Json.Serialization.Metadata.JsonMetadataServices.CreatePropertyInfo<global::System.String>(options, info2); properties[2] = propertyInfo2; return properties; } // Intentionally not a static method because we create a delegate to it. Invoking delegates to instance // methods is almost as fast as virtual calls. Static methods need to go through a shuffle thunk. private void WeatherForecastSerializeHandler(global::System.Text.Json.Utf8JsonWriter writer, global::JsonSerializerOptionsExample.WeatherForecast? value) { if (value == null) { writer.WriteNullValue(); return; } writer.WriteStartObject(); writer.WriteString(PropName_Date, value.Date); writer.WriteNumber(PropName_TemperatureCelsius, value.TemperatureCelsius); writer.WriteString(PropName_Summary, value.Summary); writer.WriteEndObject(); } } }
// <auto-generated/> #nullable enable annotations #nullable disable warnings // Suppress warnings about [Obsolete] member usage in generated code. #pragma warning disable CS0618 namespace BothModesNoOptions { [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Text.Json.SourceGeneration", "7.0.8.17405")] internal partial class SourceGenerationContext { private static global::System.Text.Json.JsonSerializerOptions s_defaultOptions { get; } = new global::System.Text.Json.JsonSerializerOptions() { DefaultIgnoreCondition = global::System.Text.Json.Serialization.JsonIgnoreCondition.Never, IgnoreReadOnlyFields = false, IgnoreReadOnlyProperties = false, IncludeFields = false, WriteIndented = true, }; private static global::BothModesNoOptions.SourceGenerationContext? s_defaultContext; /// <summary> /// The default <see cref="global::System.Text.Json.Serialization.JsonSerializerContext"/> associated with a default <see cref="global::System.Text.Json.JsonSerializerOptions"/> instance. /// </summary> public static global::BothModesNoOptions.SourceGenerationContext Default => s_defaultContext ??= new global::BothModesNoOptions.SourceGenerationContext(new global::System.Text.Json.JsonSerializerOptions(s_defaultOptions)); /// <summary> /// The source-generated options associated with this context. /// </summary> protected override global::System.Text.Json.JsonSerializerOptions? GeneratedSerializerOptions { get; } = s_defaultOptions; /// <inheritdoc/> public SourceGenerationContext() : base(null) { } /// <inheritdoc/> public SourceGenerationContext(global::System.Text.Json.JsonSerializerOptions options) : base(options) { } private static global::System.Text.Json.Serialization.JsonConverter? GetRuntimeProvidedCustomConverter(global::System.Text.Json.JsonSerializerOptions options, global::System.Type type) { global::System.Collections.Generic.IList<global::System.Text.Json.Serialization.JsonConverter> converters = options.Converters; for (int i = 0; i < converters.Count; i++) { global::System.Text.Json.Serialization.JsonConverter? converter = converters[i]; if (converter.CanConvert(type)) { if (converter is global::System.Text.Json.Serialization.JsonConverterFactory factory) { converter = factory.CreateConverter(type, options); if (converter == null || converter is global::System.Text.Json.Serialization.JsonConverterFactory) { throw new global::System.InvalidOperationException(string.Format("The converter '{0}' cannot return null or a JsonConverterFactory instance.", factory.GetType())); } } return converter; } } return null; } } }
// <auto-generated/> #nullable enable #pragma warning disable CS0162 // Unreachable code #pragma warning disable CS0164 // Unreferenced label #pragma warning disable CS0219 // Variable assigned but never used namespace JsonSerializerOptionsExample { partial class WeatherForecast { /// <remarks> /// Pattern explanation:<br/> /// <code> /// ○ Match with 2 alternative expressions, atomically.<br/> /// ○ Match a sequence of expressions.<br/> /// ○ Match a character in the set [Aa].<br/> /// ○ Match a character in the set [Bb].<br/> /// ○ Match a character in the set [Cc].<br/> /// ○ Match a sequence of expressions.<br/> /// ○ Match a character in the set [Dd].<br/> /// ○ Match a character in the set [Ee].<br/> /// ○ Match a character in the set [Ff].<br/> /// </code> /// </remarks> [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Text.RegularExpressions.Generator", "7.0.8.17405")] private static partial global::System.Text.RegularExpressions.Regex AbcOrDefGeneratedRegex() => global::System.Text.RegularExpressions.Generated.AbcOrDefGeneratedRegex_0.Instance; } } namespace System.Text.RegularExpressions.Generated { using System; using System.CodeDom.Compiler; using System.Collections; using System.ComponentModel; using System.Globalization; using System.Runtime.CompilerServices; using System.Text.RegularExpressions; using System.Threading; /// <summary>Custom <see cref="Regex"/>-derived type for the AbcOrDefGeneratedRegex method.</summary> [GeneratedCodeAttribute("System.Text.RegularExpressions.Generator", "7.0.8.17405")] file sealed class AbcOrDefGeneratedRegex_0 : Regex { /// <summary>Cached, thread-safe singleton instance.</summary> internal static readonly AbcOrDefGeneratedRegex_0 Instance = new(); /// <summary>Initializes the instance.</summary> private AbcOrDefGeneratedRegex_0() { base.pattern = "abc|def"; base.roptions = RegexOptions.IgnoreCase; ValidateMatchTimeout(Utilities.s_defaultTimeout); base.internalMatchTimeout = Utilities.s_defaultTimeout; base.factory = new RunnerFactory(); base.capsize = 1; } /// <summary>Provides a factory for creating <see cref="RegexRunner"/> instances to be used by methods on <see cref="Regex"/>.</summary> private sealed class RunnerFactory : RegexRunnerFactory { /// <summary>Creates an instance of a <see cref="RegexRunner"/> used by methods on <see cref="Regex"/>.</summary> protected override RegexRunner CreateInstance() => new Runner(); /// <summary>Provides the runner that contains the custom logic implementing the specified regular expression.</summary> private sealed class Runner : RegexRunner { /// <summary>Scan the <paramref name="inputSpan"/> starting from base.runtextstart for the next match.</summary> /// <param name="inputSpan">The text being scanned by the regular expression.</param> protected override void Scan(ReadOnlySpan<char> inputSpan) { // Search until we can't find a valid starting position, we find a match, or we reach the end of the input. while (TryFindNextPossibleStartingPosition(inputSpan) && !TryMatchAtCurrentPosition(inputSpan) && base.runtextpos != inputSpan.Length) { base.runtextpos++; if (Utilities.s_hasTimeout) { base.CheckTimeout(); } } } /// <summary>Search <paramref name="inputSpan"/> starting from base.runtextpos for the next location a match could possibly start.</summary> /// <param name="inputSpan">The text being scanned by the regular expression.</param> /// <returns>true if a possible match was found; false if no more matches are possible.</returns> private bool TryFindNextPossibleStartingPosition(ReadOnlySpan<char> inputSpan) { int pos = base.runtextpos; ulong charMinusLow; // Any possible match is at least 3 characters. if (pos <= inputSpan.Length - 3) { // The pattern matches a character in the set [CFcf] at index 2. // Find the next occurrence. If it can't be found, there's no match. ReadOnlySpan<char> span = inputSpan.Slice(pos); for (int i = 0; i < span.Length - 2; i++) { int indexOfPos = span.Slice(i + 2).IndexOfAny("CFcf"); if (indexOfPos < 0) { goto NoMatchFound; } i += indexOfPos; if (((long)((0x9000000090000000UL << (int)(charMinusLow = (uint)span[i] - 'A')) & (charMinusLow - 64)) < 0) && ((long)((0x9000000090000000UL << (int)(charMinusLow = (uint)span[i + 1] - 'B')) & (charMinusLow - 64)) < 0)) { base.runtextpos = pos + i; return true; } } } // No match found. NoMatchFound: base.runtextpos = inputSpan.Length; return false; } /// <summary>Determine whether <paramref name="inputSpan"/> at base.runtextpos is a match for the regular expression.</summary> /// <param name="inputSpan">The text being scanned by the regular expression.</param> /// <returns>true if the regular expression matches at the current position; otherwise, false.</returns> private bool TryMatchAtCurrentPosition(ReadOnlySpan<char> inputSpan) { int pos = base.runtextpos; int matchStart = pos; ReadOnlySpan<char> slice = inputSpan.Slice(pos); // Match with 2 alternative expressions, atomically. { if (slice.IsEmpty) { return false; // The input didn't match. } switch (slice[0]) { case 'A' or 'a': if ((uint)slice.Length < 3 || !slice.Slice(1).StartsWith("bc", StringComparison.OrdinalIgnoreCase)) // Match the string "bc" (ordinal case-insensitive) { return false; // The input didn't match. } pos += 3; slice = inputSpan.Slice(pos); break; case 'D' or 'd': if ((uint)slice.Length < 3 || !slice.Slice(1).StartsWith("ef", StringComparison.OrdinalIgnoreCase)) // Match the string "ef" (ordinal case-insensitive) { return false; // The input didn't match. } pos += 3; slice = inputSpan.Slice(pos); break; default: return false; // The input didn't match. } } // The input matched. base.runtextpos = pos; base.Capture(0, matchStart, pos); return true; } } } } /// <summary>Helper methods used by generated <see cref="Regex"/>-derived implementations.</summary> [GeneratedCodeAttribute("System.Text.RegularExpressions.Generator", "7.0.8.17405")] file static class Utilities { /// <summary>Default timeout value set in <see cref="AppContext"/>, or <see cref="Regex.InfiniteMatchTimeout"/> if none was set.</summary> internal static readonly TimeSpan s_defaultTimeout = AppContext.GetData("REGEX_DEFAULT_MATCH_TIMEOUT") is TimeSpan timeout ? timeout : Regex.InfiniteMatchTimeout; /// <summary>Whether <see cref="s_defaultTimeout"/> is non-infinite.</summary> internal static readonly bool s_hasTimeout = s_defaultTimeout != Timeout.InfiniteTimeSpan; } }
Code and pdf at
https://ignatandrei.github.io/RSCG_Examples/v2/docs/System.Text.Json
Leave a Reply