0

我想使用 JSON 存储树数据,但我不知道如何很好地表达类型。

下面是一个涉及猫和老鼠的假设游戏的 XML 的样子:

<level>
  <entities>
    <cat>
      <direction>right</direction>
      <position x="100" y="100"/>
    </cat>
    <mouse>
      <direction>right</direction>
      <position x="50" y="50"/>
    </mouse>
  </entities>
</level>

我能想到的最好的 JSON 如下:

{
  "entities": [
    {
      "type": "cat",
      "direction": "right",
      "position": {"x": 100, "y": 100}
    },
    {
      "type": "mouse",
      "direction": "right",
      "position": {"x": 50, "y": 50}
    }
  ]
}

这里我明确指定类型。似乎 XML 更适合这个,但不幸的是,我不能真正使用它,所以我想知道是否有更好的方法来使用 JSON。

受 Lua 的表构造函数的启发,我想出了以下内容,这显然不是 JSON,但 JS 在我的情况下实际上很好(这些数据不打算传输,它只是用于对象树):

{
  "entities": [
    cat({
      "direction": "right",
      "position": {"x": 100, "y": 100}
    }),
    mouse({
      "direction": "right",
      "position": {"x": 50, "y": 50}
    })
  ]
};

但是,就像在 Lua 中一样,缺点是我实际上必须在某处将所有可能的实体定义为函数:

function cat(options) {
  options.type = "cat";
  return options;
}

function mouse(options) {
  options.type = "mouse";
  return options;
}

您认为,在 JSON 中表达类型是否有比使用属性更好的方法?我的hack走得太远了吗?

4

2 回答 2

1

如果您的类型是唯一的,您可以使用它

var entities = {
    cat : {
        direction: "right",
        position: {x: 100, y: 100}
    },
    mouse : {
        direction: "right",
        position: {x: 50, y: 50}
    }
};

然后,如果您想访问不同的类型,请使用此

Object.keys(entities) // outputs ["cat","mouse"]

在您发表评论后编辑:

这种方式呢?

var entities = {
    cat : [{
        direction: "right",
        position: {x: 100, y: 100}
    },{
        direction: "top",
        position: {x: 150, y: 150}
    }],
    mouse : [{
        direction: "right",
        position: {x: 50, y: 50}
    }]
};
于 2013-08-07T10:14:26.237 回答
0

也许您应该重新考虑您的 XML:

<entities>
  <cat>
   <direction>right</direction>
   <position x="100" y="100"/>
  </cat>
  <mouse>
   <direction>right</direction>
   <position x="50" y="50"/>
  </mouse>
</entities>

可以更好地表达为:

<entities>
  <animal>
   <tpye>cat</type>
   <direction>right</direction>
   <position x="100" y="100"/>
  </animal>
  <animal>
   <tpye>cat</type>
   <direction>right</direction>
   <position x="50" y="50"/>
  </animal>
</entities>

可以表示为:

[{"type":"cat","direction":"right", position:{"x":"50","y":50"}},{"type":"mouse","direction":"right", position:{"x":"50","y":50"}}]

假设你有一个“动物数组”。

于 2013-08-07T10:15:55.527 回答