#javascript #json #data-uri
#javascript #json #data-uri
Вопрос:
Я столкнулся с проблемой, когда мое серверное приложение получает данные JSON, и я хотел бы снова проанализировать его в JSON. Как я мог это сделать? Я пробовал разные вещи, но, похоже, ничего не получалось. Я попытался просто разобрать его или encodeURI(data);
, но все равно не могу получить исходный JSON.
Это URI данных: data:application/json;base64,ew0KICAgICJtYWx0X3R5cGUiOiAibG9nIiwNCiAgICAibWFsdF9kYXRhIjogIldvdywgdSByIGFsbW9zdCB0aGVyZSA6TyINCn0=
Я тоже попробовал это закодировать:
var data = 'data:application/json;base64,ew0KICAgICJtYWx0X3R5cGUiOiAibG9nIiwNCiAgICAibWFsdF9kYXRhIjogIldvdywgdSByIGFsbW9zdCB0aGVyZSA6TyINCn0=';
Buffer.from(data.toString('utf8'), 'base64').toString('ascii')
Но я получаю это, если регистрирую его на консоли: u Zje F- J'm k0P"amp;VGEwGR#"amp;Fvr"@P"amp;VGEvFF#"%vwrBR"FVw7BFWamp;R$r P'
Комментарии:
1. Вы должны указать контекст, опубликовать некоторый код и объяснить, чего вы достигли, и какая часть кода дает сбой или не дает ожидаемых результатов. Вы не можете ожидать, что получите полное решение здесь.
2. Извините, я отредактировал свой пост
Ответ №1:
URI данных — это JSON, закодированный в Base64. Для этого есть два шага:
- Декодируйте Base64 (например, с
atob
помощью функции) и - Проанализировать полученный JSON
Например (в браузере):
const dataURI = "data:application/json;base64,ew0KICAgICJtYWx0X3R5cGUiOiAibG9nIiwNCiAgICAibWFsdF9kYXRhIjogIldvdywgdSByIGFsbW9zdCB0aGVyZSA6TyINCn0=";
// 29 = length of "data:application/json;base64,"
const json = atob(dataURI.substring(29));
const result = JSON.parse(json);
console.log(result);
Ваше использование Buffer
в вашем вопросе наводит меня на мысль, что вы можете использовать Node.js . Если это так, вы бы заменили вызов на atob
Buffer.from(data, 'base64').toString()
:
const dataURI = "data:application/json;base64,ew0KICAgICJtYWx0X3R5cGUiOiAibG9nIiwNCiAgICAibWFsdF9kYXRhIjogIldvdywgdSByIGFsbW9zdCB0aGVyZSA6TyINCn0=";
// 29 = length of "data:application/json;base64,"
const json = Buffer.from(dataURI.substring(29), "base64").toString();
const result = JSON.parse(json);
console.log(result);
Комментарии:
1. Я использую Node.js , и ваш код работает на меня. Большое вам спасибо
Ответ №2:
Если вы не возражаете изменить контекст на асинхронный, который вы могли бы использовать fetch()
для анализа обращения. fetch()
обычно используется с URL-адресами, но также работает с URI данных (в большинстве браузеров).
const dataURI = "data:application/json;base64,ew0KICAgICJtYWx0X3R5cGUiOiAibG9nIiwNCiAgICAibWFsdF9kYXRhIjogIldvdywgdSByIGFsbW9zdCB0aGVyZSA6TyINCn0=";
(async function () {
const response = await fetch(dataURI);
const data = await response.json();
console.log(data);
})();
Если вы уже используете библиотеку для упрощения сетевых запросов, вы также можете использовать их.
Примеры:
const dataURI = "data:application/json;base64,ew0KICAgICJtYWx0X3R5cGUiOiAibG9nIiwNCiAgICAibWFsdF9kYXRhIjogIldvdywgdSByIGFsbW9zdCB0aGVyZSA6TyINCn0=";
(async function() {
const data = await $.getJSON(dataURI);
console.log(data);
})();
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
const dataURI = "data:application/json;base64,ew0KICAgICJtYWx0X3R5cGUiOiAibG9nIiwNCiAgICAibWFsdF9kYXRhIjogIldvdywgdSByIGFsbW9zdCB0aGVyZSA6TyINCn0=";
(async function() {
const response = await axios.get(dataURI);
console.log(response.data);
})();
<script src="https://cdnjs.cloudflare.com/ajax/libs/axios/0.21.0/axios.min.js"></script>