JSON对应一个带属性的XML?

dan*_*dan 29 xml json

我正在为我的webapp设计一个API.

我想只支持JSON响应(而不是XML),因为它更加简化.

但我刚刚碰到这个XML:

<folders>
    <folder id="123" private="0" archived="0" order="1">Shopping</folder>
</folders>
Run Code Online (Sandbox Code Playgroud)

我想知道相应的JSON是怎样的.我觉得,在这种情况下,XML会更紧凑.

谢谢,丹

小智 19

也许:

{
  "folders": [
    { "id":123, "private":0, "archived":0, "order":1, "title":"Shopping" },
    ...
  ]
}
Run Code Online (Sandbox Code Playgroud)

因为XML和JSON之间没有确切的对应关系,所以您可以自由(例如必须定义)两个数据结构如何映射.例如,在上文中,"folder"元素隐含在"folders"数组中的嵌套对象中.

这可以扩展为:

"folders": [{"folder": { .... }]
Run Code Online (Sandbox Code Playgroud)

等等,但仍然存在无法像XML一样捕获内容+属性的问题.在任何情况下,您的数据结构 - > JSON | XML序列化程序可能以特定方式工作(请,请使用库,而不是"手动"JSON-string-munging).那是; XML和JSON的格式应该由数据结构统一指定(以某种方式)进行传输.

  • +1我确实喜欢这个建议,但你确实失去了事实(如果它之前有任何意义)这些值实际上是属性而不是键/值对. (2认同)
  • {"folders":[{"attributes":{"id":123,"private":0,"archived":0,"order":1,},"value":"Shopping"} ...] } (2认同)
  • 我很惊讶这个答案有很多喜欢,因为这是错的.这个json相当于xml:`<folders> <id> 123 </ id> <private> 0 </ private> <archived> 0 </ archived> <order> 1 </ order> <title> Shopping </ title > </ folders>`但不是ts提出的要求. (2认同)
  • @Supervision,实际上并非如此.问题是要求一个紧凑的等价物.你假设有一个双射是必要的,如你的json-> xml答案所示.问题是具体说它想支持json而不是xml,所以他想要一个xml-> json转换而不关心它是否有损. (2认同)

Sup*_*ion 15

此方法支持对XML的逆转换:

{
    "folders": {
        "folder":{ 
        "@": {
            "id": "123",
            "private": "0",
            "archived": "0",
            "order": "1"
            },
        "#": "Shopping"
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

它与js2xmlparser一起正常工作.

  • 是和否。虽然是一个有效的 JSON,并且可以转换回原始 XML(不是这个问题的明确要求),但它是一个带有 XML 味道且不紧凑的 JSON(问题的要求)。如果我们将这些数据直接建模为 JSON,而不参考 XML,我们可能会根据已接受的答案选择一些内容。由于 JSON 没有元素或属性的概念(而 XML 没有数组的概念),所有与 XML 之间的转换实际上都是不完美的,并且是个人偏好和确切用例的问题。 (3认同)
  • ...虽然可逆回原始 XML 可能是其他人发现这个问题的要求,因此没有否决票。也许“你需要……”应该是“怎么样……?” (3认同)

und*_*ore 8

当XML DOM表示为JSON DOM(当然具有属性)时,有一种称为badgerfish的JSON表示法/约定试图标准化(至少它自己的术语)保留大多数低级XML语义的方式(参见http:// badgerfish.ning.com/).

因此,您可以轻松地将badgerfishied-json表示形式转换回XML表示形式,您仍然可以使用您喜欢的XML工具集(对我来说是XPATH/QUERY表达式和工具)来处理结构.

它也很容易记住语法规则(总共9个),如:"属性进入名称以@开头的属性".您可以在文本编辑器中处理badgerfishied-json,而不会不必要地重载您的神经电路.通常你可以在第一关中记住它们.

  • 还有其他多种符号/约定。请参阅http://wiki.open311.org/JSON_and_XML_Conversion/另外,我还发现其中一些是混合的 (2认同)

spi*_*ier 7

YQL如何呈现XML和相应的JSON的示例.无需了解任何YQL明白这一点,但如果你有兴趣你可以检查YQL控制台,并尝试一下自己在YQL控制台

XML

<results>
    <a href="/">NBA</a>
    <a class="topnav" href="#">TEAMS</a>
    <a href="/teams/">Teams</a>
    <a href="/hawks/">Atlanta</a>
Run Code Online (Sandbox Code Playgroud)

JSON

"results": {
  "a": [
    {
     "href": "/",
     "content": "NBA"
    },
    {
     "class": "topnav",
     "href": "#",
     "content": "TEAMS"
    },
    {
     "href": "/teams/",
     "content": "Teams"
    },
    {
     "href": "/hawks/",
     "content": "Atlanta"
    },
Run Code Online (Sandbox Code Playgroud)


小智 7

在我看来,XML 和 JSON 之间最精确的对应关系需要将 XML 节点表示为一个三元组(即数组):[名称、属性、值],名称是字符串,属性是一个对象,以属性名称作为键和属性值作为(字符串)值,并将字符串值(对于原子值)或此类三元组的数组。

通过这样的映射 JSON 等价物

<folders>
    <folder id="123" private="0" archived="0" order="1">Shopping</folder>
</folders>
Run Code Online (Sandbox Code Playgroud)

将是

[  "folders",
   {}, 
   [
      [  "folder", 
         {   "id": "123",
             "private": "0",
             "archived": "0",
             "order": "1"
         },
         "Shopping"
      ]
   ]
]
Run Code Online (Sandbox Code Playgroud)

实际上,这种映射背后的想法是:

1) XML-JSON 转换是可逆的。2)保留子节点的“兄弟”关系

同时属性节点和值节点之间的区别在这里是明确的。

是否有意义?它是否证明了复杂性开销的合理性?