我的任务是定义两个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 }