internal static ClassItem DeserializeClassItem(XElement element)
        {
            int?                      accountGroup      = default;
            string                    accountNumber     = default;
            ClassItemType?            classItemType     = default;
            string                    description       = default;
            string                    descriptionPrefix = default;
            bool?                     enabled           = default;
            string                    name     = default;
            IReadOnlyList <ClassItem> subItems = default;

            if (element.Element("accountGroup") is XElement accountGroupElement)
            {
                accountGroup = (int?)accountGroupElement;
            }
            if (element.Element("accountNumber") is XElement accountNumberElement)
            {
                accountNumber = (string)accountNumberElement;
            }
            if (element.Element("classItemType") is XElement classItemTypeElement)
            {
                classItemType = new ClassItemType(classItemTypeElement.Value);
            }
            if (element.Element("description") is XElement descriptionElement)
            {
                description = (string)descriptionElement;
            }
            if (element.Element("descriptionPrefix") is XElement descriptionPrefixElement)
            {
                descriptionPrefix = (string)descriptionPrefixElement;
            }
            if (element.Element("enabled") is XElement enabledElement)
            {
                enabled = (bool?)enabledElement;
            }
            if (element.Element("name") is XElement nameElement)
            {
                name = (string)nameElement;
            }
            var array = new List <ClassItem>();

            foreach (var e in element.Elements("ClassItem"))
            {
                array.Add(DeserializeClassItem(e));
            }
            subItems = array;
            return(new ClassItem(accountGroup, accountNumber, classItemType, description, descriptionPrefix, enabled, name, subItems));
        }
        internal static ClassItem DeserializeClassItem(JsonElement element)
        {
            Optional <int>           accountGroup      = default;
            Optional <string>        accountNumber     = default;
            Optional <ClassItemType> classItemType     = default;
            Optional <string>        description       = default;
            Optional <string>        descriptionPrefix = default;
            Optional <bool>          enabled           = default;
            Optional <string>        name = default;
            Optional <IReadOnlyList <ClassItem> > subItems = default;

            foreach (var property in element.EnumerateObject())
            {
                if (property.NameEquals("accountGroup"))
                {
                    if (property.Value.ValueKind == JsonValueKind.Null)
                    {
                        property.ThrowNonNullablePropertyIsNull();
                        continue;
                    }
                    accountGroup = property.Value.GetInt32();
                    continue;
                }
                if (property.NameEquals("accountNumber"))
                {
                    accountNumber = property.Value.GetString();
                    continue;
                }
                if (property.NameEquals("classItemType"))
                {
                    if (property.Value.ValueKind == JsonValueKind.Null)
                    {
                        property.ThrowNonNullablePropertyIsNull();
                        continue;
                    }
                    classItemType = new ClassItemType(property.Value.GetString());
                    continue;
                }
                if (property.NameEquals("description"))
                {
                    description = property.Value.GetString();
                    continue;
                }
                if (property.NameEquals("descriptionPrefix"))
                {
                    descriptionPrefix = property.Value.GetString();
                    continue;
                }
                if (property.NameEquals("enabled"))
                {
                    if (property.Value.ValueKind == JsonValueKind.Null)
                    {
                        property.ThrowNonNullablePropertyIsNull();
                        continue;
                    }
                    enabled = property.Value.GetBoolean();
                    continue;
                }
                if (property.NameEquals("name"))
                {
                    name = property.Value.GetString();
                    continue;
                }
                if (property.NameEquals("subItems"))
                {
                    if (property.Value.ValueKind == JsonValueKind.Null)
                    {
                        property.ThrowNonNullablePropertyIsNull();
                        continue;
                    }
                    List <ClassItem> array = new List <ClassItem>();
                    foreach (var item in property.Value.EnumerateArray())
                    {
                        array.Add(DeserializeClassItem(item));
                    }
                    subItems = array;
                    continue;
                }
            }
            return(new ClassItem(Optional.ToNullable(accountGroup), accountNumber.Value, Optional.ToNullable(classItemType), description.Value, descriptionPrefix.Value, Optional.ToNullable(enabled), name.Value, Optional.ToList(subItems)));
        }