Вот моя ситуация: я использую стек MEAN, и на своем Angular внешнем интерфейсе я создаю экземпляры классов и помещаю их в массив массивов, которые все находятся внутри объекта gameMap / mapData. Затем я собираю и отправляю этот объект через сокет-соединение на мой сервер, который передает объект другим подключенным клиентам, чтобы они могли видеть текущее состояние игры.
Кажется, что у всех остальных есть проблемы с JSON .parse () хочет, чтобы он создавал классы, но у меня возникла противоположная проблема. Когда клиент получает этот игровой объект через сокеты и затем пытается JSON .parse () объект, он, кажется, автоматически создает экземпляры классов из данных, что вызывает проблему запуска конструктора в этих классах, перезаписывая атрибуты класса. с конструктором по умолчанию. Как я могу остановить JSON .parse от создания экземпляров этих классов и вместо этого просто создать объекты с типами?
Чтобы проиллюстрировать, что я получаю правильные данные в своем строковом JSON объекте, но проблема заключается в том, когда он разбирается, я помещаю console.log непосредственно до и после JSON .parse () моих входящих данных. Этот код выглядит следующим образом:
console.log('got existing map data, beginning processing:', mapDataRaw);
var mapData2 = JSON.parse(mapDataRaw);
console.log('parsed mapData:', mapData2);
В первом журнале консоли я получаю правильные измененные значения, как показано ниже (отредактировал и сократил возвращаемый объект, потому что он огромен):
{"location":{"row":1,"col":0,"rotate":180,"transform":"rotate(180deg)"},"hp":50,"speed":4,"range":6,"ammo":0,"shieldHP":0,"size":50,"border":"","team":"blue","moved":false,"imgAlpha":"1","name":"Fighter","missile":{"firing":true,"target":{"row":4,"col":3}},"img":"assets/img/playerShip1_blue.png","imgTop":{"img":"assets/img/Power-ups/pill_yellow.png","alpha":1,"transform":"","size":22}}
Как видите, боеприпасы установлены на 0, а внутри атрибута ракеты атрибут стрельбы установлен на true. Тем не менее, это раздел этого объекта в журнале консоли после разбора:
0: Fighter
location: {row: 1, col: 0, rotate: 180, transform: "rotate(180deg)"}
hp: 50
speed: 4
range: 6
ammo: 1
shieldHP: 0
size: 50
border: ""
team: "blue"
moved: false
imgAlpha: "1"
name: "Fighter"
missile: {firing: false, target: {…}}
img: "assets/img/playerShip1_blue.png"
__proto__: BaseObj
Обратите внимание, что боеприпасы равны 1, а в атрибуте ракета стрельба атрибута равна false. Они оба неверны и представляют собой то, что эти значения будут по умолчанию в начале игры. Также обратите внимание, что в индексе 0 массива указано «Fighter», то есть имя класса. Как в мире JSON .parse () знали, как создать его в качестве экземпляра класса Fighter, когда это, кажется, не указано нигде в необработанных строковых атрибутах объекта (у меня для 'name' установлено имя класса но я попытался изменить это на 'unitName' на случай, если 'name' было какой-то встроенной функцией имени класса, и это ничего не изменило)? Есть ли какая-либо опция, которую я могу установить, чтобы JSON анализировал эти объекты в обычные объекты вместо экземпляров классов? У меня уже есть код, написанный для копирования значений из этих объектов в фактические экземпляры объектов класса на клиенте, но это не работает, если значения, из которых я копирую, были перезаписаны по умолчанию!