internal static Dataset DeserializeDataset(JsonElement element)
        {
            if (element.TryGetProperty("type", out JsonElement discriminator))
            {
                switch (discriminator.GetString())
                {
                case "AmazonMWSObject": return(AmazonMWSObjectDataset.DeserializeAmazonMWSObjectDataset(element));

                case "AmazonRdsForOracleTable": return(AmazonRdsForOracleTableDataset.DeserializeAmazonRdsForOracleTableDataset(element));

                case "AmazonRdsForSqlServerTable": return(AmazonRdsForSqlServerTableDataset.DeserializeAmazonRdsForSqlServerTableDataset(element));

                case "AmazonRedshiftTable": return(AmazonRedshiftTableDataset.DeserializeAmazonRedshiftTableDataset(element));

                case "AmazonS3Object": return(AmazonS3Dataset.DeserializeAmazonS3Dataset(element));

                case "Avro": return(AvroDataset.DeserializeAvroDataset(element));

                case "AzureBlob": return(AzureBlobDataset.DeserializeAzureBlobDataset(element));

                case "AzureBlobFSFile": return(AzureBlobFSDataset.DeserializeAzureBlobFSDataset(element));

                case "AzureDataExplorerTable": return(AzureDataExplorerTableDataset.DeserializeAzureDataExplorerTableDataset(element));

                case "AzureDataLakeStoreFile": return(AzureDataLakeStoreDataset.DeserializeAzureDataLakeStoreDataset(element));

                case "AzureDatabricksDeltaLakeDataset": return(AzureDatabricksDeltaLakeDataset.DeserializeAzureDatabricksDeltaLakeDataset(element));

                case "AzureMariaDBTable": return(AzureMariaDBTableDataset.DeserializeAzureMariaDBTableDataset(element));

                case "AzureMySqlTable": return(AzureMySqlTableDataset.DeserializeAzureMySqlTableDataset(element));

                case "AzurePostgreSqlTable": return(AzurePostgreSqlTableDataset.DeserializeAzurePostgreSqlTableDataset(element));

                case "AzureSearchIndex": return(AzureSearchIndexDataset.DeserializeAzureSearchIndexDataset(element));

                case "AzureSqlDWTable": return(AzureSqlDWTableDataset.DeserializeAzureSqlDWTableDataset(element));

                case "AzureSqlMITable": return(AzureSqlMITableDataset.DeserializeAzureSqlMITableDataset(element));

                case "AzureSqlTable": return(AzureSqlTableDataset.DeserializeAzureSqlTableDataset(element));

                case "AzureTable": return(AzureTableDataset.DeserializeAzureTableDataset(element));

                case "Binary": return(BinaryDataset.DeserializeBinaryDataset(element));

                case "CassandraTable": return(CassandraTableDataset.DeserializeCassandraTableDataset(element));

                case "CommonDataServiceForAppsEntity": return(CommonDataServiceForAppsEntityDataset.DeserializeCommonDataServiceForAppsEntityDataset(element));

                case "ConcurObject": return(ConcurObjectDataset.DeserializeConcurObjectDataset(element));

                case "CosmosDbMongoDbApiCollection": return(CosmosDbMongoDbApiCollectionDataset.DeserializeCosmosDbMongoDbApiCollectionDataset(element));

                case "CosmosDbSqlApiCollection": return(CosmosDbSqlApiCollectionDataset.DeserializeCosmosDbSqlApiCollectionDataset(element));

                case "CouchbaseTable": return(CouchbaseTableDataset.DeserializeCouchbaseTableDataset(element));

                case "CustomDataset": return(CustomDataset.DeserializeCustomDataset(element));

                case "Db2Table": return(Db2TableDataset.DeserializeDb2TableDataset(element));

                case "DelimitedText": return(DelimitedTextDataset.DeserializeDelimitedTextDataset(element));

                case "DocumentDbCollection": return(DocumentDbCollectionDataset.DeserializeDocumentDbCollectionDataset(element));

                case "DrillTable": return(DrillTableDataset.DeserializeDrillTableDataset(element));

                case "DynamicsAXResource": return(DynamicsAXResourceDataset.DeserializeDynamicsAXResourceDataset(element));

                case "DynamicsCrmEntity": return(DynamicsCrmEntityDataset.DeserializeDynamicsCrmEntityDataset(element));

                case "DynamicsEntity": return(DynamicsEntityDataset.DeserializeDynamicsEntityDataset(element));

                case "EloquaObject": return(EloquaObjectDataset.DeserializeEloquaObjectDataset(element));

                case "Excel": return(ExcelDataset.DeserializeExcelDataset(element));

                case "FileShare": return(FileShareDataset.DeserializeFileShareDataset(element));

                case "GoogleAdWordsObject": return(GoogleAdWordsObjectDataset.DeserializeGoogleAdWordsObjectDataset(element));

                case "GoogleBigQueryObject": return(GoogleBigQueryObjectDataset.DeserializeGoogleBigQueryObjectDataset(element));

                case "GreenplumTable": return(GreenplumTableDataset.DeserializeGreenplumTableDataset(element));

                case "HBaseObject": return(HBaseObjectDataset.DeserializeHBaseObjectDataset(element));

                case "HiveObject": return(HiveObjectDataset.DeserializeHiveObjectDataset(element));

                case "HttpFile": return(HttpDataset.DeserializeHttpDataset(element));

                case "HubspotObject": return(HubspotObjectDataset.DeserializeHubspotObjectDataset(element));

                case "ImpalaObject": return(ImpalaObjectDataset.DeserializeImpalaObjectDataset(element));

                case "InformixTable": return(InformixTableDataset.DeserializeInformixTableDataset(element));

                case "JiraObject": return(JiraObjectDataset.DeserializeJiraObjectDataset(element));

                case "Json": return(JsonDataset.DeserializeJsonDataset(element));

                case "MagentoObject": return(MagentoObjectDataset.DeserializeMagentoObjectDataset(element));

                case "MariaDBTable": return(MariaDBTableDataset.DeserializeMariaDBTableDataset(element));

                case "MarketoObject": return(MarketoObjectDataset.DeserializeMarketoObjectDataset(element));

                case "MicrosoftAccessTable": return(MicrosoftAccessTableDataset.DeserializeMicrosoftAccessTableDataset(element));

                case "MongoDbAtlasCollection": return(MongoDbAtlasCollectionDataset.DeserializeMongoDbAtlasCollectionDataset(element));

                case "MongoDbCollection": return(MongoDbCollectionDataset.DeserializeMongoDbCollectionDataset(element));

                case "MongoDbV2Collection": return(MongoDbV2CollectionDataset.DeserializeMongoDbV2CollectionDataset(element));

                case "MySqlTable": return(MySqlTableDataset.DeserializeMySqlTableDataset(element));

                case "NetezzaTable": return(NetezzaTableDataset.DeserializeNetezzaTableDataset(element));

                case "ODataResource": return(ODataResourceDataset.DeserializeODataResourceDataset(element));

                case "OdbcTable": return(OdbcTableDataset.DeserializeOdbcTableDataset(element));

                case "Office365Table": return(Office365Dataset.DeserializeOffice365Dataset(element));

                case "OracleServiceCloudObject": return(OracleServiceCloudObjectDataset.DeserializeOracleServiceCloudObjectDataset(element));

                case "OracleTable": return(OracleTableDataset.DeserializeOracleTableDataset(element));

                case "Orc": return(OrcDataset.DeserializeOrcDataset(element));

                case "Parquet": return(ParquetDataset.DeserializeParquetDataset(element));

                case "PaypalObject": return(PaypalObjectDataset.DeserializePaypalObjectDataset(element));

                case "PhoenixObject": return(PhoenixObjectDataset.DeserializePhoenixObjectDataset(element));

                case "PostgreSqlTable": return(PostgreSqlTableDataset.DeserializePostgreSqlTableDataset(element));

                case "PrestoObject": return(PrestoObjectDataset.DeserializePrestoObjectDataset(element));

                case "QuickBooksObject": return(QuickBooksObjectDataset.DeserializeQuickBooksObjectDataset(element));

                case "RelationalTable": return(RelationalTableDataset.DeserializeRelationalTableDataset(element));

                case "ResponsysObject": return(ResponsysObjectDataset.DeserializeResponsysObjectDataset(element));

                case "RestResource": return(RestResourceDataset.DeserializeRestResourceDataset(element));

                case "SalesforceMarketingCloudObject": return(SalesforceMarketingCloudObjectDataset.DeserializeSalesforceMarketingCloudObjectDataset(element));

                case "SalesforceObject": return(SalesforceObjectDataset.DeserializeSalesforceObjectDataset(element));

                case "SalesforceServiceCloudObject": return(SalesforceServiceCloudObjectDataset.DeserializeSalesforceServiceCloudObjectDataset(element));

                case "SapBwCube": return(SapBwCubeDataset.DeserializeSapBwCubeDataset(element));

                case "SapCloudForCustomerResource": return(SapCloudForCustomerResourceDataset.DeserializeSapCloudForCustomerResourceDataset(element));

                case "SapEccResource": return(SapEccResourceDataset.DeserializeSapEccResourceDataset(element));

                case "SapHanaTable": return(SapHanaTableDataset.DeserializeSapHanaTableDataset(element));

                case "SapOpenHubTable": return(SapOpenHubTableDataset.DeserializeSapOpenHubTableDataset(element));

                case "SapTableResource": return(SapTableResourceDataset.DeserializeSapTableResourceDataset(element));

                case "ServiceNowObject": return(ServiceNowObjectDataset.DeserializeServiceNowObjectDataset(element));

                case "SharePointOnlineListResource": return(SharePointOnlineListResourceDataset.DeserializeSharePointOnlineListResourceDataset(element));

                case "ShopifyObject": return(ShopifyObjectDataset.DeserializeShopifyObjectDataset(element));

                case "SnowflakeTable": return(SnowflakeDataset.DeserializeSnowflakeDataset(element));

                case "SparkObject": return(SparkObjectDataset.DeserializeSparkObjectDataset(element));

                case "SqlServerTable": return(SqlServerTableDataset.DeserializeSqlServerTableDataset(element));

                case "SquareObject": return(SquareObjectDataset.DeserializeSquareObjectDataset(element));

                case "SybaseTable": return(SybaseTableDataset.DeserializeSybaseTableDataset(element));

                case "TeradataTable": return(TeradataTableDataset.DeserializeTeradataTableDataset(element));

                case "VerticaTable": return(VerticaTableDataset.DeserializeVerticaTableDataset(element));

                case "WebTable": return(WebTableDataset.DeserializeWebTableDataset(element));

                case "XeroObject": return(XeroObjectDataset.DeserializeXeroObjectDataset(element));

                case "Xml": return(XmlDataset.DeserializeXmlDataset(element));

                case "ZohoObject": return(ZohoObjectDataset.DeserializeZohoObjectDataset(element));
                }
            }
            string                 type              = default;
            Optional <string>      description       = default;
            Optional <object>      structure         = default;
            Optional <object>      schema            = default;
            LinkedServiceReference linkedServiceName = default;
            Optional <IDictionary <string, ParameterSpecification> > parameters = default;
            Optional <IList <object> >   annotations                    = default;
            Optional <DatasetFolder>     folder                         = default;
            IDictionary <string, object> additionalProperties           = default;
            Dictionary <string, object>  additionalPropertiesDictionary = new Dictionary <string, object>();

            foreach (var property in element.EnumerateObject())
            {
                if (property.NameEquals("type"))
                {
                    type = property.Value.GetString();
                    continue;
                }
                if (property.NameEquals("description"))
                {
                    description = property.Value.GetString();
                    continue;
                }
                if (property.NameEquals("structure"))
                {
                    if (property.Value.ValueKind == JsonValueKind.Null)
                    {
                        property.ThrowNonNullablePropertyIsNull();
                        continue;
                    }
                    structure = property.Value.GetObject();
                    continue;
                }
                if (property.NameEquals("schema"))
                {
                    if (property.Value.ValueKind == JsonValueKind.Null)
                    {
                        property.ThrowNonNullablePropertyIsNull();
                        continue;
                    }
                    schema = property.Value.GetObject();
                    continue;
                }
                if (property.NameEquals("linkedServiceName"))
                {
                    linkedServiceName = LinkedServiceReference.DeserializeLinkedServiceReference(property.Value);
                    continue;
                }
                if (property.NameEquals("parameters"))
                {
                    if (property.Value.ValueKind == JsonValueKind.Null)
                    {
                        property.ThrowNonNullablePropertyIsNull();
                        continue;
                    }
                    Dictionary <string, ParameterSpecification> dictionary = new Dictionary <string, ParameterSpecification>();
                    foreach (var property0 in property.Value.EnumerateObject())
                    {
                        dictionary.Add(property0.Name, ParameterSpecification.DeserializeParameterSpecification(property0.Value));
                    }
                    parameters = dictionary;
                    continue;
                }
                if (property.NameEquals("annotations"))
                {
                    if (property.Value.ValueKind == JsonValueKind.Null)
                    {
                        property.ThrowNonNullablePropertyIsNull();
                        continue;
                    }
                    List <object> array = new List <object>();
                    foreach (var item in property.Value.EnumerateArray())
                    {
                        array.Add(item.GetObject());
                    }
                    annotations = array;
                    continue;
                }
                if (property.NameEquals("folder"))
                {
                    if (property.Value.ValueKind == JsonValueKind.Null)
                    {
                        property.ThrowNonNullablePropertyIsNull();
                        continue;
                    }
                    folder = DatasetFolder.DeserializeDatasetFolder(property.Value);
                    continue;
                }
                additionalPropertiesDictionary.Add(property.Name, property.Value.GetObject());
            }
            additionalProperties = additionalPropertiesDictionary;
            return(new Dataset(type, description.Value, structure.Value, schema.Value, linkedServiceName, Optional.ToDictionary(parameters), Optional.ToList(annotations), folder.Value, additionalProperties));
        }