2011-05-10 88 views
1

我们将JSON输出添加到输出XML的现有API,以使MobileHTML集成更加容易。但是,我们的开发人员查询了JSON输出中出现的@attributes的使用。在JSON非标准或标准中使用@attributes?

我们原来的XML看起来像:

<markers> 
    <marker id="11906" latitude="52.226578" 
    ... 

等等JSON出来为:

callbackname({"marker":[{"@attributes":{"id":"11906","latitude":"52.226578" 
.... 

我们的开发者表示:

“虽然 '@属性' 是合法的JSON,它似乎打破点符号,所以我不能调用数据。@属性。我可以调用数据['@属性'],所以有一个解决方法,但它似乎更安全避免使用@ -symbol,除非有充分的理由。“

的XML-> JSON(P)转换完成后使用:

$xmlObject = simplexml_load_string ($data); 
$data = json_encode ($xmlObject); 

我想使我们的API作为易于集成成为可能,因此,尽可能使用标准的东西。但是我们使用了原生的PHP json_encode函数,所以如果它做的是非标准的东西,我会感到很惊讶。

是否使用@attributes非标准?这基本上只是我们的API在使用<marker id..>而不是<marker><id>方面有点缺陷的问题?

回答

3

JSON standard只指定什么是和无效;它没有设定惯例。使用无效的JavaScript标识符的属性名称没有任何内在的错误。

然而,正如你的开发人员指出的那样,这使得在JS中使用结果稍微尴尬,因为它使得不可能使用点符号。 On the gripping hand,使用简单内容的属性通常被视为“良好的XML”,并且您正在使用默认的内置工具将XML转换为JSON。我倾向于认为有足够的理由让它保持原样。

如果是我,我会考虑实现一个自定义的XML - > JSON转换器是多么困难。如果它简单明了,那就走这条路线,并避免@attribute(它也可能使你的JSON变得更小更简单)。然而,如果它太麻烦了,错误地使用点符号并不是世界的尽头。最坏的情况下,var attr = data.marker["@attributes"];将解决此问题。

+2

'simplexml_load_string'函数非常*必须为XML属性使用无效的标识符。它选择的任何有效的Javascript标识符也将是一个有效的XML元素名称,因此可能在XML中遇到它正在转化为Javascript对象。该功能需要将这些属性分组到不会干扰子元素的地方。 – 2011-05-10 23:09:53

+0

@Rob - 极好的一点,忘了提。这就是为什么自定义转换器可以解决这个问题(您可以手动选择不冲突的名称),但通用转换器不能。 – 2011-05-10 23:23:09