【问题标题】:JSON.stringify does not represent Object which was StringifiedJSON.stringify 不代表被字符串化的对象
【发布时间】:2018-04-04 17:44:33
【问题描述】:

我正在为一个学校项目开发 Connect Four 应用程序。 目前,我正在尝试 JSON.stringify 包含“洞”对象的二维数组(每个包含键:x、y、列、行、p1 和 p2)的对象,以便我可以将其发送到服务器,并让它广播两个客户端->这将使两个客户端的游戏状态保持更新。

就在我 JSON.stringify(holeObjArray) 之前,我 console.logged 对象的内容,它们显示更新的游戏状态:

object before stringify

我已经突出显示(红色):holeObjArray[5][6] 包含一个键 'p1' = 1,这对应于当前游戏状态(在右侧)。

当我 JSON.stringify 对象时,在这里看到:

function sendGrid()
{
  console.log(holeObjArray);
  JSONStr = JSON.stringify(holeObjArray);
  console.log(JSONStr);
  //ws.send(JSONStr);
}

JSONStr 的输出显示如下:

object after stringify

如您所见,字符串化的对象并不代表当前的游戏状态。事实上,如果我继续播放,字符串化的对象将始终代表 last 播放时棋盘的状态。 我不明白为什么 JSON.stringify() 会这样做? 特别是因为holeObjArray 在我对它进行字符串化之前正确地表示了网格,但是一旦我这样做了,JSONStr 字符串就表示在刚刚制作的网格之前正在移动的网格。 对此问题的任何帮助将不胜感激,

谢谢,

亚历克斯

【问题讨论】:

  • 控制台位于 - 您在控制台中看到的值可以更改 - 而 JSON.stringify 是真正的不可变字符串快照
  • 好的...但是当我继续玩游戏并让客户端 JSON.parse 传递的 JSONString(游戏状态)时,每个客户端都会显示一个落后一步的游戏状态.所以,JSONString 已经过时了(一步之遥)......
  • 在移动完成后你不是调用这个代码吗?没有代码很难看出问题所在......
  • 你需要显示比你显示的更多的代码
  • 我已经编辑了问题并添加了客户端代码。谢谢你,Jaromanda X

标签: javascript json node.js stringify


【解决方案1】:

在控制台中,当您展开一个对象时,它会在您展开它时显示对象属性的值,而不是在您将其记录到控制台时。所以记录对象的 JSON.stringify 方式是在记录时显示当前值的正确方式。

【讨论】:

    【解决方案2】:

    好的,我很抱歉这不完整。但我想我至少知道你可以从哪里开始。

    我相信您知道,Javascript 处理范围的方式很有趣,因此有时会产生看似不可预测的状态。我的直觉是,在这种情况下,JSON.stringify() 方法是hoisted,因此比您想要的更快地将字符串分配给您的JSONStr 变量。

    试试这样的方法:

    const sendGrid = function(wholeObjArray) {
      console.log(holeObjArray);
      let JSONStr = JSON.stringify(wholeObjArray);
      return JSONStr;
    }
    // where gamestate === wholeObjArray
    console.log(sendGrid(gameState));
    ws.send(sendGrid(gameState));
    

    这应该确保在您真正想要之前不会对 JSON 对象进行字符串化。

    如果有帮助,请告诉我!

    【讨论】:

    • 'wholeObjArray' 和 'holeObjArray' 应该不同吗?
    • 大声笑,我的错,我认为这就是我的大脑在你的例子中阅读它的方式
    猜你喜欢
    • 1970-01-01
    • 2018-05-06
    • 1970-01-01
    • 2019-12-01
    • 2013-08-25
    • 2020-04-16
    • 1970-01-01
    相关资源
    最近更新 更多