Переопределить парсер JSON при выборке

Я пишу программу на 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, чтобы сделать это самостоятельно.

Я сам не использовал пользовательскую десериализацию, но это выглядит как многообещающий урок: eduardoboucas.com/posts/…

Peter B 12.06.2024 01:03

@PeterB AFAIK невозможно доставить оживитель Response.json(); и даже если вы используете ревивер с JSON.parse, он получает уже разобранные значения; это преобразователь значений, а не декодер. В ванильном JS нет способа перехватить анализ числа и вместо этого проанализировать его как bigint. Это можно было бы сделать только в том случае, если бы bigints были закодированы в JSON как строки, а не числа. Единственный способ проанализировать число JSON как bigint — это именно то, что делает OP, используя совершенно другой декодер JSON.

Amadan 12.06.2024 02:30

Однако, если OP может изменить свой код генерации JSON, например, для создания "42n" или ["bigint", "42"], или что-то подобное вместо просто 42, то использование возрождения будет возможно, вероятно, быстрее, чем использование всей альтернативной библиотеки, написанной на JavaScript.

Amadan 12.06.2024 02:43

Что такое ревивер?

farhany 24.06.2024 01:30

Reviver — второй аргумент для JSON.parse. Прочтите документацию здесь, но по сути это обратный вызов, который JSON.parse будет вызывать, чтобы «оживить» каждое значение; например, преобразование специально отформатированного значения, совместимого с JSON, в объект, который невозможно представить непосредственно в JSON, например datetime (или, действительно, bigints). Это метод, который использует ссылка Питера Б.

Amadan 08.07.2024 04:48
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
5
52
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Просто: не используйте Response.json(). Вместо этого возьмите тело, а затем разберите его самостоятельно. Т.е. вместо

response.json().then(data => ({
  list: data,
}))

использовать

response.text().then(body => ({
  list: JSONParse(body),
}))

Спасибо за решение! Я уверен, что другим это тоже может оказаться полезным!

farhany 12.06.2024 17:45

Другие вопросы по теме