我的任务是定义两个Web应用程序之间的通信。我决定为此使用JSON。在JSON中拥有根节点有多普​​遍?

假设我们有一个汽车对象。这是带有“Car”作为根节点的JSON:

{"Car": {
  "Make":"Mustang",
  "YearBuilt":"1999"}}

因此,现在让我们说我有一个Tire对象,并且由于我们标准化了具有根节点的功能,因此该对象也必须具有它。
{"Tire": {"Make": "Brirdgestone", "Size":"15"}}

将轮胎对象JSON集成到原始的Car对象中显示出它可能很笨拙。
{"Car": { "Make":"Mustang",
"YearBuilt":"1999",
"Tires": "[{"Tire": {"Make": "Brirdgestone", "Size":"15"}},
{"Tire": {"Make": "Brirdgestone", "Size":"15"}},
{"Tire": {"Make": "Bridgestone", "Size":"15"}},
{"Tire": {"Make": "Brirdgestone", "Size":"15"}}
]}}

在PHP中进行序列化后,第一个Tire的品牌就是$object->Car->Tires[0]->Tire->Make。由于有根节点,所以那里有额外的Tyre级。

如果Tire没有根节点,则代码可能会更 slim 。
{"Car": { "Make":"Mustang",
"YearBuilt":"1999",
"Tires": "[{ {"Make": "Bridgestone", "Size":"15"}},
{"Make": "Brirdgestone", "Size":"15"}},
{"Make": "Brirdgestone", "Size":"15"}},
{"Make": "Brirdgestone", "Size":"15"}}]}}

在PHP中,减少了困惑,因为减少了冗余:第一个轮胎的品牌由$object->Car->Tires[0]->Make调用

没有根节点有什么不好的吗?我喜欢拥有根节点,因为它的行为就像一个类名,但是不必要的级别会困扰我很多,并使遍历更加复杂。

最佳答案

我将省略两个根节点,即Tire和Car。

请记住,JSON的主要用途是以紧凑格式通过网络传输对象。除此之外,没有其他实际用途。您要使用JSON编码的数据,并通过添加根节点来创建没有实际标识和用途的空容器对象。当省略根节点时,

$car->tires[0]->make

然后在JS中
car.tires[0].make

这更清晰,代表对象更好。请记住,这是您将要使用的。当然,您可以使用某种JSON映射器来映射对象应如何序列化并生成上面的对象,但这是很多额外的工作,不值得恕我直言。

如果您想在JSON中使用类别名称,只需将其设为属性即可,例如
{ 'klass': 'Car', 'make': 'Mustang', 'year':1999 }

08-26 10:37