/// <summary>
 /// Initializes a new instance of the <see cref="FieldValue"/> structure. This constructor
 /// is intended to be used for mocking only.
 /// </summary>
 /// <param name="value">The actual field value.</param>
 internal FieldValue(FieldValueGender value)
     : this()
 {
     ValueType   = FieldValueType.Gender;
     ValueGender = value;
 }
 /// <summary>
 /// Initializes a new instance of the <see cref="FieldValue"/> structure.
 /// </summary>
 /// <param name="value">The actual field value.</param>
 /// <returns>A new <see cref="FieldValue"/> instance for mocking.</returns>
 public static FieldValue FieldValueWithGenderValueType(FieldValueGender value) =>
 new FieldValue(value);
        internal static FieldValue_internal DeserializeFieldValue_internal(JsonElement element)
        {
            FieldValueType            type             = default;
            Optional <string>         valueString      = default;
            Optional <DateTimeOffset> valueDate        = default;
            Optional <TimeSpan>       valueTime        = default;
            Optional <string>         valuePhoneNumber = default;
            Optional <float>          valueNumber      = default;
            Optional <long>           valueInteger     = default;
            Optional <IReadOnlyList <FieldValue_internal> > valueArray = default;
            Optional <IReadOnlyDictionary <string, FieldValue_internal> > valueObject = default;
            Optional <SelectionMarkState>     valueSelectionMark = default;
            Optional <FieldValueGender>       valueGender        = default;
            Optional <string>                 valueCountry       = default;
            Optional <string>                 text        = default;
            Optional <IReadOnlyList <float> > boundingBox = default;
            Optional <float> confidence = default;
            Optional <IReadOnlyList <string> > elements = default;
            Optional <int> page = default;

            foreach (var property in element.EnumerateObject())
            {
                if (property.NameEquals("type"))
                {
                    type = property.Value.GetString().ToFieldValueType();
                    continue;
                }
                if (property.NameEquals("valueString"))
                {
                    valueString = property.Value.GetString();
                    continue;
                }
                if (property.NameEquals("valueDate"))
                {
                    if (property.Value.ValueKind == JsonValueKind.Null)
                    {
                        property.ThrowNonNullablePropertyIsNull();
                        continue;
                    }
                    valueDate = property.Value.GetDateTimeOffset("D");
                    continue;
                }
                if (property.NameEquals("valueTime"))
                {
                    if (property.Value.ValueKind == JsonValueKind.Null)
                    {
                        property.ThrowNonNullablePropertyIsNull();
                        continue;
                    }
                    valueTime = property.Value.GetTimeSpan("T");
                    continue;
                }
                if (property.NameEquals("valuePhoneNumber"))
                {
                    valuePhoneNumber = property.Value.GetString();
                    continue;
                }
                if (property.NameEquals("valueNumber"))
                {
                    if (property.Value.ValueKind == JsonValueKind.Null)
                    {
                        property.ThrowNonNullablePropertyIsNull();
                        continue;
                    }
                    valueNumber = property.Value.GetSingle();
                    continue;
                }
                if (property.NameEquals("valueInteger"))
                {
                    if (property.Value.ValueKind == JsonValueKind.Null)
                    {
                        property.ThrowNonNullablePropertyIsNull();
                        continue;
                    }
                    valueInteger = property.Value.GetInt64();
                    continue;
                }
                if (property.NameEquals("valueArray"))
                {
                    if (property.Value.ValueKind == JsonValueKind.Null)
                    {
                        property.ThrowNonNullablePropertyIsNull();
                        continue;
                    }
                    List <FieldValue_internal> array = new List <FieldValue_internal>();
                    foreach (var item in property.Value.EnumerateArray())
                    {
                        array.Add(DeserializeFieldValue_internal(item));
                    }
                    valueArray = array;
                    continue;
                }
                if (property.NameEquals("valueObject"))
                {
                    if (property.Value.ValueKind == JsonValueKind.Null)
                    {
                        property.ThrowNonNullablePropertyIsNull();
                        continue;
                    }
                    Dictionary <string, FieldValue_internal> dictionary = new Dictionary <string, FieldValue_internal>();
                    foreach (var property0 in property.Value.EnumerateObject())
                    {
                        if (property0.Value.ValueKind == JsonValueKind.Null)
                        {
                            dictionary.Add(property0.Name, null);
                        }
                        else
                        {
                            dictionary.Add(property0.Name, DeserializeFieldValue_internal(property0.Value));
                        }
                    }
                    valueObject = dictionary;
                    continue;
                }
                if (property.NameEquals("valueSelectionMark"))
                {
                    if (property.Value.ValueKind == JsonValueKind.Null)
                    {
                        property.ThrowNonNullablePropertyIsNull();
                        continue;
                    }
                    valueSelectionMark = property.Value.GetString().ToSelectionMarkState();
                    continue;
                }
                if (property.NameEquals("valueGender"))
                {
                    if (property.Value.ValueKind == JsonValueKind.Null)
                    {
                        property.ThrowNonNullablePropertyIsNull();
                        continue;
                    }
                    valueGender = new FieldValueGender(property.Value.GetString());
                    continue;
                }
                if (property.NameEquals("valueCountry"))
                {
                    valueCountry = property.Value.GetString();
                    continue;
                }
                if (property.NameEquals("text"))
                {
                    text = property.Value.GetString();
                    continue;
                }
                if (property.NameEquals("boundingBox"))
                {
                    if (property.Value.ValueKind == JsonValueKind.Null)
                    {
                        property.ThrowNonNullablePropertyIsNull();
                        continue;
                    }
                    List <float> array = new List <float>();
                    foreach (var item in property.Value.EnumerateArray())
                    {
                        array.Add(item.GetSingle());
                    }
                    boundingBox = array;
                    continue;
                }
                if (property.NameEquals("confidence"))
                {
                    if (property.Value.ValueKind == JsonValueKind.Null)
                    {
                        property.ThrowNonNullablePropertyIsNull();
                        continue;
                    }
                    confidence = property.Value.GetSingle();
                    continue;
                }
                if (property.NameEquals("elements"))
                {
                    if (property.Value.ValueKind == JsonValueKind.Null)
                    {
                        property.ThrowNonNullablePropertyIsNull();
                        continue;
                    }
                    List <string> array = new List <string>();
                    foreach (var item in property.Value.EnumerateArray())
                    {
                        array.Add(item.GetString());
                    }
                    elements = array;
                    continue;
                }
                if (property.NameEquals("page"))
                {
                    if (property.Value.ValueKind == JsonValueKind.Null)
                    {
                        property.ThrowNonNullablePropertyIsNull();
                        continue;
                    }
                    page = property.Value.GetInt32();
                    continue;
                }
            }
            return(new FieldValue_internal(type, valueString.Value, Optional.ToNullable(valueDate), Optional.ToNullable(valueTime), valuePhoneNumber.Value, Optional.ToNullable(valueNumber), Optional.ToNullable(valueInteger), Optional.ToList(valueArray), Optional.ToDictionary(valueObject), Optional.ToNullable(valueSelectionMark), Optional.ToNullable(valueGender), valueCountry.Value, text.Value, Optional.ToList(boundingBox), Optional.ToNullable(confidence), Optional.ToList(elements), Optional.ToNullable(page)));
        }