Как мне остановить Json .Parse () от создания экземпляров классов, найденных в строковом объекте? - PullRequest
0 голосов
/ 30 января 2020

Вот моя ситуация: я использую стек 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 анализировал эти объекты в обычные объекты вместо экземпляров классов? У меня уже есть код, написанный для копирования значений из этих объектов в фактические экземпляры объектов класса на клиенте, но это не работает, если значения, из которых я копирую, были перезаписаны по умолчанию!

1 Ответ

0 голосов
/ 31 января 2020

Хорошо, я понял, что происходит, на случай, если кто-нибудь столкнется с подобной ситуацией. Я думаю, это связано с подъемом JavaScript. Позже в моем коде я установил карту другого объекта, равную gameData.map, а затем отредактировал значения и скорректировал ее. Очевидно, JavaScript поднимал всю эту настройку и новый объектный код до верха перед моим console.logs, так что, хотя казалось, что значения менялись сразу после разбора, это было на самом деле позже, что значения были изменены , Причиной root было то, что карта этого другого объекта была установлена ​​равной gameData.map, потому что вместо копирования значений вместо этого они буквально указывали на те же объекты, что вызывало их перезапись в том, что я считал неизменным оригиналом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...