Не удается извлечь JSON из ответа API — Google Cloud Vision API (Node.js библиотека)

# #node.js #json #google-cloud-platform

Вопрос:

Вероятно, это простая проблема с JSON, но я изо всех сил пытаюсь извлечь данные из ответа на обнаружение текста с помощью API Google Vision на Node.js

Ответ, который я получаю, выглядит для меня как данные JSON (вот образец необработанного ответа в виде строки).:

 [{webDetection: null, logoAnnotations: [], context: null, safeSearchAnnotation: null,  fullTextAnnotation: {pages: [{blocks: [{blockType: TEXT, paragraphs: [{words: [{symbols:  [{boundingBox: {normalizedVertices: [], vertices: [{x: 568, y: 0}, {x: 601, y: 1}, {x:  600, y: 84}, {x: 567, y: 83}]}, property: {detectedBreak: null, detectedLanguages:  [{languageCode: en, confidence: 0}]}, confidence: 0.9900000095367432, text: B},  {boundingBox: {normalizedVertices: [], vertices: [{x: 615, y: 0}, {x: 640, y: 0}, {x: 639,  y: 83}, {x: 614, y: 83}]}, property: {detectedBreak: null, detectedLanguages:  [{languageCode: en, confidence: 0}]}, confidence: 1, text: a}, {boundingBox:  {normalized...  

Однако, когда я пытаюсь проанализировать его следующим образом, я получаю ошибку.

 const jsonData = response[0].fullTextAnnotation; const textAnnotation = JSON.parse(jsonData);   

Ошибка: Синтаксическая ошибка: Неожиданный токен o в JSON в позиции 1

Есть идеи, что я делаю не так и как я могу правильно извлечь данные?

Обновить

Я пробовал читать данные в виде массивов и карт, которые не работают с обычными циклами for, но работают, если я использую цикл int, например

Не работает:

 const fullTextAnnotation = response[0].fullTextAnnotation;  const pages = fullTextAnnotation.pages;  const allBlocks = [];  for (var page in pages) {  const blocks = page.blocks;  for (var block in blocks) {  allBlocks.push(block);  }  }  

Действительно работает:

 const fullTextAnnotation = response[0].fullTextAnnotation;  const pages = fullTextAnnotation.pages;  const allBlocks = [];  for (var i = 0; ilt;pages.length;i  ) {  const blocks = pages[i].blocks;  for (var j = 0; jlt;blocks.length;j  ) {  allBlocks.push(blocks[j]);  }  }  

Когда я использую обычный цикл for, я получаю ошибку: Свойство «блоки» не существует для типа «строка».

Когда я использую цикл int, свойство блоков правильно отображается как: const блоки: vision.protos.google.cloud.vision.v1.IBlock[]

Это то, с чем я могу справиться, я думаю, однако мне определенно любопытно, что происходит не так, потому что потребовалось много догадок, чтобы найти обходной путь.

Комментарии:

1. вы ждали ответа?

2. Ага. И информация, которая мне нужна, определенно там есть. Если я просмотрю строку, я смогу увидеть распознанный текст.

Ответ №1:

Трудно сказать без полной строки и без предыдущего кода, но похоже, что вы можете получить полную текстовую аннотацию перед анализом строки. Я бы предложил попытаться проанализировать ответ или ответ[0], а затем назначить переменной TextAnnotation значение fullTextAnnotation.

Если бы вы могли предоставить общий доступ к console.log() ответа, ответа[0], соответствующего JSON.parses() для них, а затем, возможно, к ответу unparse[0].fullTextAnnotation, это определенно помогло бы нам диагностировать проблему!

Комментарии:

1. Использование другого типа цикла for решило мою проблему, однако, если у меня будет время позже, я посмотрю, смогу ли я получить журналы консоли, чтобы попытаться выяснить, почему JSON не анализирует из интереса (хотя я предполагаю, что это потому, что я пытался проанализировать объект API Vision).