Я пишу программу на golang, которая отправляет большие значения int64, но целые числа теряют точность из-за того, что JS хранит их внутри как float64. Я нашел библиотеку json-with-bigint, но не знаю, как использовать функцию JSONParser библиотеки с fetch().
Мой код выглядит так (это метод в VueJS):
fetchList() {
console.info("fetchList called");
const url = "/List"
fetch(url, {
credentials: "same-origin",
})
.then(response =>
response.json().then(data => ({
list: data,
}))
.then(res => {
this.servers = res.servers;
})
.catch(err => console.info(err)));
console.info(this.list);
},
Есть идеи? Я просто недостаточно хорошо разбираюсь в JS, чтобы сделать это самостоятельно.
@PeterB AFAIK невозможно доставить оживитель Response.json(); и даже если вы используете ревивер с JSON.parse, он получает уже разобранные значения; это преобразователь значений, а не декодер. В ванильном JS нет способа перехватить анализ числа и вместо этого проанализировать его как bigint. Это можно было бы сделать только в том случае, если бы bigints были закодированы в JSON как строки, а не числа. Единственный способ проанализировать число JSON как bigint — это именно то, что делает OP, используя совершенно другой декодер JSON.
Однако, если OP может изменить свой код генерации JSON, например, для создания "42n" или ["bigint", "42"], или что-то подобное вместо просто 42, то использование возрождения будет возможно, вероятно, быстрее, чем использование всей альтернативной библиотеки, написанной на JavaScript.
Что такое ревивер?
Reviver — второй аргумент для JSON.parse. Прочтите документацию здесь, но по сути это обратный вызов, который JSON.parse будет вызывать, чтобы «оживить» каждое значение; например, преобразование специально отформатированного значения, совместимого с JSON, в объект, который невозможно представить непосредственно в JSON, например datetime (или, действительно, bigints). Это метод, который использует ссылка Питера Б.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Просто: не используйте Response.json(). Вместо этого возьмите тело, а затем разберите его самостоятельно. Т.е. вместо
response.json().then(data => ({
list: data,
}))
использовать
response.text().then(body => ({
list: JSONParse(body),
}))
Спасибо за решение! Я уверен, что другим это тоже может оказаться полезным!
Я сам не использовал пользовательскую десериализацию, но это выглядит как многообещающий урок: eduardoboucas.com/posts/…