我的任务是定义两个网络应用之间的通信。我决定使用JSON。在JSON中有一个根节点有多常见?
假设我们有一个汽车对象。这是JSON,其中“Car”是根节点:
{"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中序列化,第一个轮胎的制造将是$object->Car->Tires[0]->Tire->Make
。由于根节点,那里有额外的轮胎级别。
如果Tire没有根节点,那么代码可能会变得更加纤薄。
{"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
没有根节点有什么不好吗?我喜欢拥有根节点,因为它的行为类似于类名,但是不必要的级别会让我感到很烦恼并且会使遍历变得更复杂。
答案 0 :(得分:5)
我省略了两个根节点,轮胎和 Car 。
请记住,JSON的主要用途是以紧凑的格式通过网络传输对象。除此之外没有其他真正的用法。您希望使用JSON编码的数据,并通过添加根节点,您创建的空容器对象没有真正的身份和目的。省略根节点时,你会得到
$car->tires[0]->make
在JS中你会得到
car.tires[0].make
这更清晰,更好地代表了对象。请记住,这是您必须使用的。当然,您可以使用某种JSON映射器来映射对象应该如何序列化并导致上述对象,但这需要付出额外的努力而且不值得imho。
如果您想在JSON中使用类名,只需将其设为属性,例如
{ 'klass': 'Car', 'make': 'Mustang', 'year':1999 }
答案 1 :(得分:0)
@Gordon提出了很好的观点。但是,我喜欢使用AOP和AJAX消息来拦截与服务器之间的消息。这些拦截器为每条消息添加一个时间戳和从服务器发送的消息的状态标志(失败,异常,成功,等等......)。正如您可能推测的那样,我使用根JSON节点来处理有效负载,状态和时间戳。
可以在前端的一个功能(方面)中检查从服务器发送的状态标志,并在一个地方处理所有异常。当服务器因异常以外的原因而失败时,方面/建议允许将数据传递给AJAX启动器。