问题描述
我想获得 JSON 的长度,但它没有给出我想要的值。我正在使用 XML 到 JSON 转换器库 (xml2js)。如果您知道除 xml2js 之外的另一个库。我也可以用。
console.log(result.length) -> 返回 2,这是正确的。
{
LISTENER: [
{
CONNECTTIME: { _text: '4880' },UID: { _text: '57' },XFF: {},GRID: { _text: '57' },TRIGGERS: { _text: '0' }
},{
CONNECTTIME: { _text: '254' },UID: { _text: '65' },GRID: { _text: '65' },TRIGGERS: { _text: '0' }
}
]
}
但是如果我从 JSON 中删除一条记录,如下所示。
console.log(result.length) -> 返回 9,这是错误的。我希望它是 1。我哪里做错了?
{
LISTENER: {
CONNECTTIME: { _text: '4587' },TRIGGERS: { _text: '0' }
}
}
有人可以帮我吗?是否有任何强制选项可以使两个记录都转换为数组。
其他帮助信息;
这是代码。
var options = {ignoreComment: true,alwaysChildren: true,compact: true}
var result = convert.xml2js(response.data,options);
console.log("listeners.listener:"+Object.keys(result.SHOUTCASTSERVER.LISTENERS.LISTENER).length);
console.log(util.inspect(result.SHOUTCASTSERVER.LISTENERS,false,null,true /* enable colors */))
response.data 是从网站获取请求(使用 axios 库)的响应。提供 XML 页面的正文。
This XML file does not appear to have any style information associated with it. The document tree is shown below.
<SHOUTCASTSERVER>
<LISTENERS>
<LISTENER>
<CONNECTTIME>350</CONNECTTIME>
<UID>66</UID>
<XFF/>
<GRID>66</GRID>
<TRIGGERS>0</TRIGGERS>
</LISTENER>
</LISTENERS>
</SHOUTCASTSERVER>
XML 页面转换与库 (XMLtoJS) 结果的输出(如果有1条记录这样转换);
{
_declaration: {
_attributes: { version: '1.0',encoding: 'UTF-8',standalone: 'yes' }
},SHOUTCASTSERVER: {
LISTENERS: {
LISTENER: {
CONNECTTIME: { _text: '657' },UID: { _text: '66' },GRID: { _text: '66' },TRIGGERS: { _text: '0' }
}
}
}
}
{
_declaration: {
_attributes: { version: '1.0',SHOUTCASTSERVER: {
LISTENERS: {
LISTENER: [
{
CONNECTTIME: { _text: '819' },TRIGGERS: { _text: '0' }
},{
CONNECTTIME: { _text: '3' },UID: { _text: '68' },GRID: { _text: '68' },TRIGGERS: { _text: '0' }
}
]
}
}
}
解决方法
你应该在 XML 中尝试一些类型定义,否则当你将 xml 转换为 js 时会发生这种情况。如果 XML 节点只有一个子节点,解析器会自动将其转换为对象。
,我发现了问题。如果有 1 条记录,XMLtoJSON 库将转换为对象。但如果有 2 个或更多记录,则转换为数组。
为了解决这个问题,我们应该为选项添加 alwaysArray: true
属性。