#javascript #json #dictionary
#javascript #json #словарь
Вопрос:
Есть ли у нас способ доступа к машинному коду JSON.stringify, который мы можем использовать или настраивать? кажется, на определенном сайте я сталкиваюсь с этой проблемой, когда JSON.stringify (новая карта ()) выдает «[]» вместо «{}». Могут быть некоторые настройки для этого собственного кода, но я не могу сузить его.
Кто-нибудь когда-нибудь сталкивался с этой проблемой? Любые выводы были бы полезны.
Комментарии:
1.
JSON.stringify(new Map())
возвращает{}
для меня. Возможно, выMap
где-то полиполнили?
Ответ №1:
Я не могу воспроизвести проблему. Я получаю {}
, когда я строю новую карту.
Тем не менее, общий подход к решению проблем такого типа следующий:
Машинный код зависит от браузера, обычно написан на C и может быть или не быть открытым исходным кодом в зависимости от браузера. В любом случае, это, вероятно, не очень полезно для вас.
Если вы хотите пользовательскую обработку типа объекта, передайте функцию replacer в качестве второго аргумента stringify
и попросите ее сделать что-то пользовательское с Map
объектами.
const data = new Map();
const replacer = (key, value) => {
if (value instanceof Map) {
return {};
}
return value;
};
const json = JSON.stringify(data, replacer, 2);
console.log(json);
Комментарии:
1. Реализация
Map
giving{}
не зависит от реализации —JSON.stringify
будет перебирать перечислимые собственные свойства и помещать их внутрь{}
s, но карты не имеют перечислимых собственных свойств. Поскольку у OP естьJSON.stringify(new Map())
giving'[]'
, тоMap.prototype.toJSON
, вероятно, он был перезаписан.
Ответ №2:
Вы можете изменить Map.prototype.toJSON
на return []
вместо {}
:
Map.prototype.toJSON = () => [];
console.log(JSON.stringify(new Map()));
Итак, если вы ищете, почему сериализованная карта выдает []
вместо {}
, найдите в кодовой базе изменения toJSON
.
(но это странно и нарушит обычные ожидания большинства разработчиков — карты не сериализуемы, поэтому следует избегать попыток сделать это неявно)