【问题标题】:Root Nodes in JSONJSON 中的根节点
【发布时间】:2010-01-21 07:59:59
【问题描述】:

我的任务是定义两个 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 中序列化,第一个轮胎的品牌将是 $object->Car->Tires[0]->Tire->Make。由于根节点,那里有额外的轮胎等级。

如果轮胎没有根节点,代码可能会更精简。

{"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 调用

没有根节点有什么不好的吗?我喜欢根节点,因为它就像一个类名,但不必要的关卡让我很烦恼,并且会使遍历变得更加复杂。

【问题讨论】:

    标签: php javascript json


    【解决方案1】:

    我会省略两个根节点,TireCar

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

    $car->tires[0]->make
    

    在 JS 中你会得到 ​​p>

    car.tires[0].make
    

    这更清晰,更好地代表了对象。请记住,这是您必须使用的。当然,您可以使用某种 JSON 映射器来映射对象应如何序列化并生成上述对象,但这需要付出很多额外的努力,恕我直言不值得。

    如果您想在 JSON 中包含类名,只需将其设为属性,例如

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

    【讨论】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2011-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-13
      相关资源
      最近更新 更多