JSON.stringify (новая карта ()) печатает «[]» вместо «{}» для конкретной организации

#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 .

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