Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/263.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php JSON中的根节点_Php_Javascript_Json - Fatal编程技术网

Php JSON中的根节点

Php JSON中的根节点,php,javascript,json,Php,Javascript,Json,我的任务是定义两个web应用程序之间的通信。我已经决定为此使用JSON。在JSON中有一个根节点有多常见 假设我们有一个汽车物体。这是以“Car”作为根节点的JSON: {"Car": { "Make":"Mustang", "YearBuilt":"1999"}} 现在让我们假设我有一个Tire对象,因为我们正在标准化根节点,这个对象也必须有它 {"Tire": {"Make": "Brirdgestone", "Size":"15"}} 将tire对象JSON集成到原始Car

我的任务是定义两个web应用程序之间的通信。我已经决定为此使用JSON。在JSON中有一个根节点有多常见

假设我们有一个汽车物体。这是以“Car”作为根节点的JSON:

{"Car": { 
  "Make":"Mustang", 
  "YearBuilt":"1999"}}
现在让我们假设我有一个Tire对象,因为我们正在标准化根节点,这个对象也必须有它

{"Tire": {"Make": "Brirdgestone", "Size":"15"}}
将tire对象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

没有根节点有什么坏处吗?我喜欢使用根节点,因为它的行为类似于类名,但不必要的级别会让我感到非常困扰,并且会使遍历变得更加复杂。

我会同时省略根节点,Tire和Car

请记住,JSON的主要用途是以紧凑的格式通过网络传输对象。除此之外,没有其他真正的用法。您希望使用JSON编码的数据,通过添加根节点,您正在创建没有真实身份和用途的空容器对象。当省略根节点时,您将得到

$car->tires[0]->make
在JS中,您将获得

car.tires[0].make
这更清晰,更好地表示对象。记住,这是你必须处理的问题。当然,您可以使用某种JSON映射器来映射对象应该如何序列化,从而生成上述对象,但这需要付出很多额外的努力,不值得这么做

如果您想在JSON中使用类名,只需将其设置为属性,例如

{ 'klass': 'Car', 'make': 'Mustang', 'year':1999 }

@戈登提出了很好的观点。但是,我喜欢将AOP与AJAX消息一起使用,以截获与服务器之间的消息。这些拦截器为每条消息添加一个时间戳,并在从服务器发送的消息上添加一个状态标志(失败、异常、成功等等)。正如您可能猜测的那样,我将使用根JSON节点作为有效负载、状态和时间戳


从服务器发送的状态标志可以在前端的一个功能(方面)中检查,所有异常都可以在一个地方处理。当服务器由于异常以外的原因失败时,方面/建议允许将数据传递给AJAX启动器。

我同意。根节点只会使消费应用程序代码变得不必要的冗长。很酷,非常感谢。我想到了一个重要的领域。如果JSON镜像了XML文档,那么至少应该在主对象上添加一个,因为在XML中,需要根元素。一位同事还指出,它对于JSONP回调非常重要,如果我创建一个API,它将是一个更好的结构。例如,Yahoo和ebay API将所有内容包装在ResultSet节点上。这允许关心类型的解析器将ResultSet绑定到对象类型。好吧,我相信你可以想到它可能会派上用场的用例,但是再次强调,每当我在我的应用程序中使用JSON时,我都有知道如何处理接收到的数据的回调,例如,example.com/cars/find/id/123将返回汽车数据,我的回调将创建这些数据。