# #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).