diff --git a/.changes/next-release/feature-AmazonTextract-23606a7.json b/.changes/next-release/feature-AmazonTextract-23606a7.json new file mode 100644 index 000000000000..27d11dc1ef4f --- /dev/null +++ b/.changes/next-release/feature-AmazonTextract-23606a7.json @@ -0,0 +1,6 @@ +{ + "type": "feature", + "category": "Amazon Textract", + "contributor": "", + "description": "This release introduces additional support for 30+ normalized fields such as vendor address and currency. It also includes OCR output in the response and accuracy improvements for the already supported fields in previous version" +} diff --git a/services/textract/src/main/resources/codegen-resources/endpoint-tests.json b/services/textract/src/main/resources/codegen-resources/endpoint-tests.json index e5b34717ecb2..40ad9a46b82c 100644 --- a/services/textract/src/main/resources/codegen-resources/endpoint-tests.json +++ b/services/textract/src/main/resources/codegen-resources/endpoint-tests.json @@ -8,9 +8,9 @@ } }, "params": { - "UseDualStack": true, + "UseFIPS": true, "Region": "ap-south-1", - "UseFIPS": true + "UseDualStack": true } }, { @@ -21,9 +21,9 @@ } }, "params": { - "UseDualStack": false, + "UseFIPS": true, "Region": "ap-south-1", - "UseFIPS": true + "UseDualStack": false } }, { @@ -34,9 +34,9 @@ } }, "params": { - "UseDualStack": true, + "UseFIPS": false, "Region": "ap-south-1", - "UseFIPS": false + "UseDualStack": true } }, { @@ -47,9 +47,9 @@ } }, "params": { - "UseDualStack": false, + "UseFIPS": false, "Region": "ap-south-1", - "UseFIPS": false + "UseDualStack": false } }, { @@ -60,9 +60,9 @@ } }, "params": { - "UseDualStack": true, + "UseFIPS": true, "Region": "us-gov-east-1", - "UseFIPS": true + "UseDualStack": true } }, { @@ -73,9 +73,9 @@ } }, "params": { - "UseDualStack": false, + "UseFIPS": true, "Region": "us-gov-east-1", - "UseFIPS": true + "UseDualStack": false } }, { @@ -86,9 +86,9 @@ } }, "params": { - "UseDualStack": true, + "UseFIPS": false, "Region": "us-gov-east-1", - "UseFIPS": false + "UseDualStack": true } }, { @@ -99,9 +99,9 @@ } }, "params": { - "UseDualStack": false, + "UseFIPS": false, "Region": "us-gov-east-1", - "UseFIPS": false + "UseDualStack": false } }, { @@ -112,9 +112,9 @@ } }, "params": { - "UseDualStack": true, + "UseFIPS": true, "Region": "ca-central-1", - "UseFIPS": true + "UseDualStack": true } }, { @@ -125,9 +125,9 @@ } }, "params": { - "UseDualStack": false, + "UseFIPS": true, "Region": "ca-central-1", - "UseFIPS": true + "UseDualStack": false } }, { @@ -138,9 +138,9 @@ } }, "params": { - "UseDualStack": true, + "UseFIPS": false, "Region": "ca-central-1", - "UseFIPS": false + "UseDualStack": true } }, { @@ -151,9 +151,9 @@ } }, "params": { - "UseDualStack": false, + "UseFIPS": false, "Region": "ca-central-1", - "UseFIPS": false + "UseDualStack": false } }, { @@ -164,9 +164,9 @@ } }, "params": { - "UseDualStack": true, + "UseFIPS": true, "Region": "eu-central-1", - "UseFIPS": true + "UseDualStack": true } }, { @@ -177,9 +177,9 @@ } }, "params": { - "UseDualStack": false, + "UseFIPS": true, "Region": "eu-central-1", - "UseFIPS": true + "UseDualStack": false } }, { @@ -190,9 +190,9 @@ } }, "params": { - "UseDualStack": true, + "UseFIPS": false, "Region": "eu-central-1", - "UseFIPS": false + "UseDualStack": true } }, { @@ -203,9 +203,9 @@ } }, "params": { - "UseDualStack": false, + "UseFIPS": false, "Region": "eu-central-1", - "UseFIPS": false + "UseDualStack": false } }, { @@ -216,9 +216,9 @@ } }, "params": { - "UseDualStack": true, + "UseFIPS": true, "Region": "us-west-1", - "UseFIPS": true + "UseDualStack": true } }, { @@ -229,9 +229,9 @@ } }, "params": { - "UseDualStack": false, + "UseFIPS": true, "Region": "us-west-1", - "UseFIPS": true + "UseDualStack": false } }, { @@ -242,9 +242,9 @@ } }, "params": { - "UseDualStack": true, + "UseFIPS": false, "Region": "us-west-1", - "UseFIPS": false + "UseDualStack": true } }, { @@ -255,9 +255,9 @@ } }, "params": { - "UseDualStack": false, + "UseFIPS": false, "Region": "us-west-1", - "UseFIPS": false + "UseDualStack": false } }, { @@ -268,9 +268,9 @@ } }, "params": { - "UseDualStack": true, + "UseFIPS": true, "Region": "us-west-2", - "UseFIPS": true + "UseDualStack": true } }, { @@ -281,9 +281,9 @@ } }, "params": { - "UseDualStack": false, + "UseFIPS": true, "Region": "us-west-2", - "UseFIPS": true + "UseDualStack": false } }, { @@ -294,9 +294,9 @@ } }, "params": { - "UseDualStack": true, + "UseFIPS": false, "Region": "us-west-2", - "UseFIPS": false + "UseDualStack": true } }, { @@ -307,9 +307,9 @@ } }, "params": { - "UseDualStack": false, + "UseFIPS": false, "Region": "us-west-2", - "UseFIPS": false + "UseDualStack": false } }, { @@ -320,9 +320,9 @@ } }, "params": { - "UseDualStack": true, + "UseFIPS": true, "Region": "eu-west-3", - "UseFIPS": true + "UseDualStack": true } }, { @@ -333,9 +333,9 @@ } }, "params": { - "UseDualStack": false, + "UseFIPS": true, "Region": "eu-west-3", - "UseFIPS": true + "UseDualStack": false } }, { @@ -346,9 +346,9 @@ } }, "params": { - "UseDualStack": true, + "UseFIPS": false, "Region": "eu-west-3", - "UseFIPS": false + "UseDualStack": true } }, { @@ -359,9 +359,9 @@ } }, "params": { - "UseDualStack": false, + "UseFIPS": false, "Region": "eu-west-3", - "UseFIPS": false + "UseDualStack": false } }, { @@ -372,9 +372,9 @@ } }, "params": { - "UseDualStack": true, + "UseFIPS": true, "Region": "eu-west-2", - "UseFIPS": true + "UseDualStack": true } }, { @@ -385,9 +385,9 @@ } }, "params": { - "UseDualStack": false, + "UseFIPS": true, "Region": "eu-west-2", - "UseFIPS": true + "UseDualStack": false } }, { @@ -398,9 +398,9 @@ } }, "params": { - "UseDualStack": true, + "UseFIPS": false, "Region": "eu-west-2", - "UseFIPS": false + "UseDualStack": true } }, { @@ -411,9 +411,9 @@ } }, "params": { - "UseDualStack": false, + "UseFIPS": false, "Region": "eu-west-2", - "UseFIPS": false + "UseDualStack": false } }, { @@ -424,9 +424,9 @@ } }, "params": { - "UseDualStack": true, + "UseFIPS": true, "Region": "eu-west-1", - "UseFIPS": true + "UseDualStack": true } }, { @@ -437,9 +437,9 @@ } }, "params": { - "UseDualStack": false, + "UseFIPS": true, "Region": "eu-west-1", - "UseFIPS": true + "UseDualStack": false } }, { @@ -450,9 +450,9 @@ } }, "params": { - "UseDualStack": true, + "UseFIPS": false, "Region": "eu-west-1", - "UseFIPS": false + "UseDualStack": true } }, { @@ -463,9 +463,9 @@ } }, "params": { - "UseDualStack": false, + "UseFIPS": false, "Region": "eu-west-1", - "UseFIPS": false + "UseDualStack": false } }, { @@ -476,9 +476,9 @@ } }, "params": { - "UseDualStack": true, + "UseFIPS": true, "Region": "ap-northeast-2", - "UseFIPS": true + "UseDualStack": true } }, { @@ -489,9 +489,9 @@ } }, "params": { - "UseDualStack": false, + "UseFIPS": true, "Region": "ap-northeast-2", - "UseFIPS": true + "UseDualStack": false } }, { @@ -502,9 +502,9 @@ } }, "params": { - "UseDualStack": true, + "UseFIPS": false, "Region": "ap-northeast-2", - "UseFIPS": false + "UseDualStack": true } }, { @@ -515,9 +515,9 @@ } }, "params": { - "UseDualStack": false, + "UseFIPS": false, "Region": "ap-northeast-2", - "UseFIPS": false + "UseDualStack": false } }, { @@ -528,9 +528,9 @@ } }, "params": { - "UseDualStack": true, + "UseFIPS": true, "Region": "us-gov-west-1", - "UseFIPS": true + "UseDualStack": true } }, { @@ -541,9 +541,9 @@ } }, "params": { - "UseDualStack": false, + "UseFIPS": true, "Region": "us-gov-west-1", - "UseFIPS": true + "UseDualStack": false } }, { @@ -554,9 +554,9 @@ } }, "params": { - "UseDualStack": true, + "UseFIPS": false, "Region": "us-gov-west-1", - "UseFIPS": false + "UseDualStack": true } }, { @@ -567,9 +567,9 @@ } }, "params": { - "UseDualStack": false, + "UseFIPS": false, "Region": "us-gov-west-1", - "UseFIPS": false + "UseDualStack": false } }, { @@ -580,9 +580,9 @@ } }, "params": { - "UseDualStack": true, + "UseFIPS": true, "Region": "ap-southeast-1", - "UseFIPS": true + "UseDualStack": true } }, { @@ -593,9 +593,9 @@ } }, "params": { - "UseDualStack": false, + "UseFIPS": true, "Region": "ap-southeast-1", - "UseFIPS": true + "UseDualStack": false } }, { @@ -606,9 +606,9 @@ } }, "params": { - "UseDualStack": true, + "UseFIPS": false, "Region": "ap-southeast-1", - "UseFIPS": false + "UseDualStack": true } }, { @@ -619,9 +619,9 @@ } }, "params": { - "UseDualStack": false, + "UseFIPS": false, "Region": "ap-southeast-1", - "UseFIPS": false + "UseDualStack": false } }, { @@ -632,9 +632,9 @@ } }, "params": { - "UseDualStack": true, + "UseFIPS": true, "Region": "ap-southeast-2", - "UseFIPS": true + "UseDualStack": true } }, { @@ -645,9 +645,9 @@ } }, "params": { - "UseDualStack": false, + "UseFIPS": true, "Region": "ap-southeast-2", - "UseFIPS": true + "UseDualStack": false } }, { @@ -658,9 +658,9 @@ } }, "params": { - "UseDualStack": true, + "UseFIPS": false, "Region": "ap-southeast-2", - "UseFIPS": false + "UseDualStack": true } }, { @@ -671,9 +671,9 @@ } }, "params": { - "UseDualStack": false, + "UseFIPS": false, "Region": "ap-southeast-2", - "UseFIPS": false + "UseDualStack": false } }, { @@ -682,9 +682,9 @@ "error": "FIPS and DualStack are enabled, but this partition does not support one or both" }, "params": { - "UseDualStack": true, + "UseFIPS": true, "Region": "us-iso-east-1", - "UseFIPS": true + "UseDualStack": true } }, { @@ -695,9 +695,9 @@ } }, "params": { - "UseDualStack": false, + "UseFIPS": true, "Region": "us-iso-east-1", - "UseFIPS": true + "UseDualStack": false } }, { @@ -706,9 +706,9 @@ "error": "DualStack is enabled but this partition does not support DualStack" }, "params": { - "UseDualStack": true, + "UseFIPS": false, "Region": "us-iso-east-1", - "UseFIPS": false + "UseDualStack": true } }, { @@ -719,9 +719,9 @@ } }, "params": { - "UseDualStack": false, + "UseFIPS": false, "Region": "us-iso-east-1", - "UseFIPS": false + "UseDualStack": false } }, { @@ -732,9 +732,9 @@ } }, "params": { - "UseDualStack": true, + "UseFIPS": true, "Region": "us-east-1", - "UseFIPS": true + "UseDualStack": true } }, { @@ -745,9 +745,9 @@ } }, "params": { - "UseDualStack": false, + "UseFIPS": true, "Region": "us-east-1", - "UseFIPS": true + "UseDualStack": false } }, { @@ -758,9 +758,9 @@ } }, "params": { - "UseDualStack": true, + "UseFIPS": false, "Region": "us-east-1", - "UseFIPS": false + "UseDualStack": true } }, { @@ -771,9 +771,9 @@ } }, "params": { - "UseDualStack": false, + "UseFIPS": false, "Region": "us-east-1", - "UseFIPS": false + "UseDualStack": false } }, { @@ -784,9 +784,9 @@ } }, "params": { - "UseDualStack": true, + "UseFIPS": true, "Region": "us-east-2", - "UseFIPS": true + "UseDualStack": true } }, { @@ -797,9 +797,9 @@ } }, "params": { - "UseDualStack": false, + "UseFIPS": true, "Region": "us-east-2", - "UseFIPS": true + "UseDualStack": false } }, { @@ -810,9 +810,9 @@ } }, "params": { - "UseDualStack": true, + "UseFIPS": false, "Region": "us-east-2", - "UseFIPS": false + "UseDualStack": true } }, { @@ -823,9 +823,9 @@ } }, "params": { - "UseDualStack": false, + "UseFIPS": false, "Region": "us-east-2", - "UseFIPS": false + "UseDualStack": false } }, { @@ -836,9 +836,9 @@ } }, "params": { - "UseDualStack": false, - "Region": "us-east-1", "UseFIPS": false, + "Region": "us-east-1", + "UseDualStack": false, "Endpoint": "https://example.com" } }, @@ -848,9 +848,9 @@ "error": "Invalid Configuration: FIPS and custom endpoint are not supported" }, "params": { - "UseDualStack": false, - "Region": "us-east-1", "UseFIPS": true, + "Region": "us-east-1", + "UseDualStack": false, "Endpoint": "https://example.com" } }, @@ -860,9 +860,9 @@ "error": "Invalid Configuration: Dualstack and custom endpoint are not supported" }, "params": { - "UseDualStack": true, - "Region": "us-east-1", "UseFIPS": false, + "Region": "us-east-1", + "UseDualStack": true, "Endpoint": "https://example.com" } } diff --git a/services/textract/src/main/resources/codegen-resources/service-2.json b/services/textract/src/main/resources/codegen-resources/service-2.json index 358be8f051a7..fc0b987355c4 100644 --- a/services/textract/src/main/resources/codegen-resources/service-2.json +++ b/services/textract/src/main/resources/codegen-resources/service-2.json @@ -32,7 +32,7 @@ {"shape":"ThrottlingException"}, {"shape":"HumanLoopQuotaExceededException"} ], - "documentation":"

Analyzes an input document for relationships between detected items.

The types of information returned are as follows:

Selection elements such as check boxes and option buttons (radio buttons) can be detected in form data and in tables. A SELECTION_ELEMENT Block object contains information about a selection element, including the selection status.

You can choose which type of analysis to perform by specifying the FeatureTypes list.

The output is returned in a list of Block objects.

AnalyzeDocument is a synchronous operation. To analyze documents asynchronously, use StartDocumentAnalysis.

For more information, see Document Text Analysis.

" + "documentation":"

Analyzes an input document for relationships between detected items.

The types of information returned are as follows:

Selection elements such as check boxes and option buttons (radio buttons) can be detected in form data and in tables. A SELECTION_ELEMENT Block object contains information about a selection element, including the selection status.

You can choose which type of analysis to perform by specifying the FeatureTypes list.

The output is returned in a list of Block objects.

AnalyzeDocument is a synchronous operation. To analyze documents asynchronously, use StartDocumentAnalysis.

For more information, see Document Text Analysis.

" }, "AnalyzeExpense":{ "name":"AnalyzeExpense", @@ -53,7 +53,7 @@ {"shape":"InternalServerError"}, {"shape":"ThrottlingException"} ], - "documentation":"

AnalyzeExpense synchronously analyzes an input document for financially related relationships between text.

Information is returned as ExpenseDocuments and seperated as follows.

" + "documentation":"

AnalyzeExpense synchronously analyzes an input document for financially related relationships between text.

Information is returned as ExpenseDocuments and seperated as follows:

" }, "AnalyzeID":{ "name":"AnalyzeID", @@ -95,7 +95,7 @@ {"shape":"InternalServerError"}, {"shape":"ThrottlingException"} ], - "documentation":"

Detects text in the input document. Amazon Textract can detect lines of text and the words that make up a line of text. The input document must be an image in JPEG, PNG, PDF, or TIFF format. DetectDocumentText returns the detected text in an array of Block objects.

Each document page has as an associated Block of type PAGE. Each PAGE Block object is the parent of LINE Block objects that represent the lines of detected text on a page. A LINE Block object is a parent for each word that makes up the line. Words are represented by Block objects of type WORD.

DetectDocumentText is a synchronous operation. To analyze documents asynchronously, use StartDocumentTextDetection.

For more information, see Document Text Detection.

" + "documentation":"

Detects text in the input document. Amazon Textract can detect lines of text and the words that make up a line of text. The input document must be in one of the following image formats: JPEG, PNG, PDF, or TIFF. DetectDocumentText returns the detected text in an array of Block objects.

Each document page has as an associated Block of type PAGE. Each PAGE Block object is the parent of LINE Block objects that represent the lines of detected text on a page. A LINE Block object is a parent for each word that makes up the line. Words are represented by Block objects of type WORD.

DetectDocumentText is a synchronous operation. To analyze documents asynchronously, use StartDocumentTextDetection.

For more information, see Document Text Detection.

" }, "GetDocumentAnalysis":{ "name":"GetDocumentAnalysis", @@ -115,7 +115,7 @@ {"shape":"InvalidS3ObjectException"}, {"shape":"InvalidKMSKeyException"} ], - "documentation":"

Gets the results for an Amazon Textract asynchronous operation that analyzes text in a document.

You start asynchronous text analysis by calling StartDocumentAnalysis, which returns a job identifier (JobId). When the text analysis operation finishes, Amazon Textract publishes a completion status to the Amazon Simple Notification Service (Amazon SNS) topic that's registered in the initial call to StartDocumentAnalysis. To get the results of the text-detection operation, first check that the status value published to the Amazon SNS topic is SUCCEEDED. If so, call GetDocumentAnalysis, and pass the job identifier (JobId) from the initial call to StartDocumentAnalysis.

GetDocumentAnalysis returns an array of Block objects. The following types of information are returned:

Selection elements such as check boxes and option buttons (radio buttons) can be detected in form data and in tables. A SELECTION_ELEMENT Block object contains information about a selection element, including the selection status.

Use the MaxResults parameter to limit the number of blocks that are returned. If there are more results than specified in MaxResults, the value of NextToken in the operation response contains a pagination token for getting the next set of results. To get the next page of results, call GetDocumentAnalysis, and populate the NextToken request parameter with the token value that's returned from the previous call to GetDocumentAnalysis.

For more information, see Document Text Analysis.

" + "documentation":"

Gets the results for an Amazon Textract asynchronous operation that analyzes text in a document.

You start asynchronous text analysis by calling StartDocumentAnalysis, which returns a job identifier (JobId). When the text analysis operation finishes, Amazon Textract publishes a completion status to the Amazon Simple Notification Service (Amazon SNS) topic that's registered in the initial call to StartDocumentAnalysis. To get the results of the text-detection operation, first check that the status value published to the Amazon SNS topic is SUCCEEDED. If so, call GetDocumentAnalysis, and pass the job identifier (JobId) from the initial call to StartDocumentAnalysis.

GetDocumentAnalysis returns an array of Block objects. The following types of information are returned:

While processing a document with queries, look out for INVALID_REQUEST_PARAMETERS output. This indicates that either the per page query limit has been exceeded or that the operation is trying to query a page in the document which doesn’t exist.

Selection elements such as check boxes and option buttons (radio buttons) can be detected in form data and in tables. A SELECTION_ELEMENT Block object contains information about a selection element, including the selection status.

Use the MaxResults parameter to limit the number of blocks that are returned. If there are more results than specified in MaxResults, the value of NextToken in the operation response contains a pagination token for getting the next set of results. To get the next page of results, call GetDocumentAnalysis, and populate the NextToken request parameter with the token value that's returned from the previous call to GetDocumentAnalysis.

For more information, see Document Text Analysis.

" }, "GetDocumentTextDetection":{ "name":"GetDocumentTextDetection", @@ -356,7 +356,7 @@ "members":{ "BlockType":{ "shape":"BlockType", - "documentation":"

The type of text item that's recognized. In operations for text detection, the following types are returned:

In text analysis operations, the following types are returned:

" + "documentation":"

The type of text item that's recognized. In operations for text detection, the following types are returned:

In text analysis operations, the following types are returned:

" }, "Confidence":{ "shape":"Percent", @@ -408,7 +408,7 @@ }, "Page":{ "shape":"UInteger", - "documentation":"

The page on which a block was detected. Page is returned by asynchronous operations. Page values greater than 1 are only returned for multipage documents that are in PDF or TIFF format. A scanned image (JPEG/PNG), even if it contains multiple document pages, is considered to be a single-page document. The value of Page is always 1. Synchronous operations don't return Page because every input document is considered to be a single-page document.

" + "documentation":"

The page on which a block was detected. Page is returned by synchronous and asynchronous operations. Page values greater than 1 are only returned for multipage documents that are in PDF or TIFF format. A scanned image (JPEG/PNG) provided to an asynchronous operation, even if it contains multiple document pages, is considered a single-page document. This means that for scanned images the value of Page is always 1. Synchronous operations operations will also return a Page value of 1 because every input document is considered to be a single-page document.

" }, "Query":{ "shape":"Query", @@ -564,6 +564,20 @@ "member":{"shape":"EntityType"} }, "ErrorCode":{"type":"string"}, + "ExpenseCurrency":{ + "type":"structure", + "members":{ + "Code":{ + "shape":"String", + "documentation":"

Currency code for detected currency.

" + }, + "Confidence":{ + "shape":"Percent", + "documentation":"

Percentage confideence in the detected currency.

" + } + }, + "documentation":"

Returns the kind of currency detected.

" + }, "ExpenseDetection":{ "type":"structure", "members":{ @@ -593,6 +607,10 @@ "LineItemGroups":{ "shape":"LineItemGroupList", "documentation":"

Information detected on each table of a document, seperated into LineItems.

" + }, + "Blocks":{ + "shape":"BlockList", + "documentation":"

This is a block object, the same as reported when DetectDocumentText is run on a document. It provides word level recognition of text.

" } }, "documentation":"

The structure holding all the information returned by AnalyzeExpense

" @@ -619,6 +637,14 @@ "PageNumber":{ "shape":"UInteger", "documentation":"

The page number the value was detected on.

" + }, + "Currency":{ + "shape":"ExpenseCurrency", + "documentation":"

Shows the kind of currency, both the code and confidence associated with any monatary value detected.

" + }, + "GroupProperties":{ + "shape":"ExpenseGroupPropertyList", + "documentation":"

Shows which group a response object belongs to, such as whether an address line belongs to the vendor's address or the recipent's address.

" } }, "documentation":"

Breakdown of detected information, seperated into the catagories Type, LabelDetection, and ValueDetection

" @@ -627,6 +653,24 @@ "type":"list", "member":{"shape":"ExpenseField"} }, + "ExpenseGroupProperty":{ + "type":"structure", + "members":{ + "Types":{ + "shape":"StringList", + "documentation":"

Informs you on the kind of label associated with the group

" + }, + "Id":{ + "shape":"String", + "documentation":"

Provides a group Id number, which will be the same for each in the group.

" + } + }, + "documentation":"

Shows the group that a certain key belongs to. This helps differentiate responses like addresses that can appear similar in response JSON.

" + }, + "ExpenseGroupPropertyList":{ + "type":"list", + "member":{"shape":"ExpenseGroupProperty"} + }, "ExpenseType":{ "type":"structure", "members":{ @@ -1188,7 +1232,7 @@ }, "Pages":{ "shape":"QueryPages", - "documentation":"

List of pages associated with the query. The following is a list of rules for using this parameter.

" + "documentation":"

Pages is a parameter that the user inputs to specify which pages to apply a query to. The following is a list of rules for using this parameter.

" } }, "documentation":"

Each query contains the question you want to ask in the Text and the alias you want to associate.

" @@ -1421,6 +1465,10 @@ }, "StatusMessage":{"type":"string"}, "String":{"type":"string"}, + "StringList":{ + "type":"list", + "member":{"shape":"String"} + }, "TextType":{ "type":"string", "enum":[