Я пытаюсь создать файл JSON из ответа AWS Textract, но по какой-то причине ответ дается в виде строки внутри файла JSON. Я делал это раньше, и он работал нормально, но мне нужно добавить фрагмент кода, в котором я перезапускаю функцию, вызывающую API getDocumentTextDetection, пока ВСЕ данные ответа не будут получены (максимальная длина ответа Textract равна 1000). Как только весь ответ получен, он затем добавляется в файл JSON, который хранится в S3 Bucket.
Когда я открываю файл JSON, там есть все данные, но они представлены в виде строки, а не в формате JSON. Я заметил кавычки в начале и конце ответа, и когда я вручную удаляю его и добавляю файл в JSON валидатор, он считается действительным JSON, поэтому я не знаю, почему эти цитаты оценки добавляются. Я полагаю, что могу вернуть ответ не в то время, или я использую неправильные команды. Любая помощь будет высоко ценится. PS Я работаю в NodeJS.
Вот код, который у меня есть:
exports.handler = async (event, context, callback) => {
try {
const notification = JSON.parse(event.Records[0].Sns.Message);
const JobID = notification.JobId;
const key = notification.DocumentLocation.S3ObjectName;
const bucket = notification.DocumentLocation.S3Bucket;
const status = notification.Status;
console.log(JSON.stringify(notification, null, '\t'));
if ( status === "SUCCEEDED" ) {
const textResult = await getDocumentText(JobID, null);
console.log(textResult);
await jsonWriter(JobID, bucket, key, textResult);
}
} catch (error) {
callback(error);
} finally {
callback(null);
}
};
const getDocumentText = async (jobId, nextToken) => {
console.log("nextToken", nextToken);
const params = {
JobId: jobId,
MaxResults: 1000,
NextToken: nextToken
};
if (!nextToken) delete params.NextToken;
let {
JobStatus: _jobStatus,
NextToken: _nextToken,
Blocks: _blocks
} = await textract.getDocumentTextDetection(params).promise();
let textractResult = _blocks
.map(item => {
const JSONitem = JSON.stringify(item);
return JSONitem;
})
// .join( );
if (_nextToken) {
textractResult += await getDocumentText(jobId, _nextToken);
}
return textractResult;
};
async function jsonWriter(JobID, bucket, key, response) {
const body = [
{
"PDFFile": key,
"JobID": JobID,
"textractResponse": response
}
];
try {
const putJSONBack = await s3.putObject({
Bucket: 'textract-response',
Key: `${keySlice(key)}.json`,
Body: JSON.stringify(body, null, '\t'),
ContentType: "application/json"
}).promise();
console.log(putJSONBack);
} catch(error) {
console.log(error);
}
}
Вот ответ, который я получаю:
ОТКРЫТО JSON ПРИМЕР ОТВЕТА
Если вы не можете открыть изображение, я имею в виду следующее:
textractResponse: "{"BlockType":"PAGE","Geometry":{"BoundingBox":{"Width":1,"Height":1,"Left":0,"Top":0},"Polygon":[{"X":7.4295......
Вы увидите это после textractResponse есть кавычка, которой там быть не должно.
Вот как я бы хотел, чтобы это было:
[
{
PDFFile: "TEST.pdf",
JobID: "123456789",
textractResponse: {
"BlockType": "PAGE",
"Geometry": {
"BoundingBox": {
"Width": 1,
"Height": 1,
"Left": 0,
"Top": 0
},
"Polygon": [
{
"X": 7.429523841969991e-17,
"Y": 0
},
{
"X": 1,
"Y": 2.0175399684800355e-16
}.....
Заранее извиняюсь, если это глупая ошибка (которую я думаю, что это так), я просто полностью смущен этим. Спасибо