узел, извлекающий JSON из URL - PullRequest
1 голос
/ 09 ноября 2019

Я пытаюсь получить и проанализировать JSON, возвращенный ниже, в Nodejs. Кажется, проблема в том, что код узла пытается проанализировать строку JSON, которая содержит символы новой строки, но я не уверен, как этого избежать и почему fetch работает в chrome devtools. Я предполагаю, что проблема заключается в моем упрощенном знании запросов https, поэтому я был бы очень признателен, если бы кто-нибудь смог объяснить, что происходит не так.

const url = "https://beta.charitycommission.gov.uk/umbraco/api/charityApi/getSearchResults?searchText=&pageNumber=1&contextId=1126&onlyShow=&&&&&&&"

Я могу успешно запустить это в chrome devtools, открытомдомен. Кроме того, JSON, по-видимому, автоматически анализируется для объекта, чего я не ожидал.

fetch(url).then(res => res.json()).then(json => console.log(json.pageItems))

Я попытался выполнить следующие действия в узле, но ни одна из них не работает.

const fetch = require("node-fetch");
await fetch(url).then(res => res.json()); // Unexpected token  in JSON at position 0

const rp = require('request-promise-native');
const json = await rp({uri: url}) // returns JSON string with newline characters
JSON.parse(json) // Unexpected token  in JSON at position 0

Ответы [ 2 ]

3 голосов
/ 09 ноября 2019

Проблема в в том, что ваш файл JSON сохранен в формате спецификации UTF-8.

Что это значит?

Ваш файлначинается с так называемого символа метки порядка байтов, U+FEFF (без пробела нулевой ширины) .

Это невидимо (имеет нулевую ширину), но все еще там, и интерпретатор JSON не может его проанализировать.

Как решить?

  1. Сохраните данные JSON без спецификации или
  2. Используйте res.text(), а затем JSON.parse(text.slice(1)), чтобы удалить начальный символ:

    fetch(url)
    .then(res => res.text())
    .then(text => JSON.parse(text.slice(1)))
    .then(json => console.log(json.pageItems))
    

Почему он работает в Chrome?

Chrome автоматически удаляет символ спецификации из любого извлеченного / загруженного файла, чтобы избежать подобных проблем.

0 голосов
/ 09 ноября 2019

Попробуйте использовать значение по умолчанию fetch:

const json = await fetch(url).then(res => res.json())

res.json(), анализирует данные JSON и возвращает объект. Используйте await, чтобы вернуть данные в переменную json.

...