AWS Ответ Textract возвращает формат строки вместо формата JSON - PullRequest
0 голосов
/ 09 апреля 2020

Я пытаюсь создать файл 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
          }.....

Заранее извиняюсь, если это глупая ошибка (которую я думаю, что это так), я просто полностью смущен этим. Спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...