【问题标题】:JSON Length giving the incorrect valueJSON 长度给出不正确的值
【发布时间】:2021-07-02 18:10:09
【问题描述】:

我想获得 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' },
      XFF: {},
      GRID: { _text: '65' },
      TRIGGERS: { _text: '0' }
    }
  ]
}

但如果我从 JSON 中删除一条记录,如下所示。

console.log(result.length) -> 返回 9,这是错误的。我希望它是 1。我在哪里做错了?

{
    LISTENER: {
        CONNECTTIME: { _text: '4587' },
        UID: { _text: '57' },
        XFF: {},
        GRID: { _text: '57' },
        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' },
        XFF: {},
        GRID: { _text: '66' },
        TRIGGERS: { _text: '0' }
      }
    }
  }
}

结果的输出(2条记录输出);

{
  _declaration: {
    _attributes: { version: '1.0', encoding: 'UTF-8', standalone: 'yes' }
  },
  SHOUTCASTSERVER: {
    LISTENERS: {
      LISTENER: [
        {
          CONNECTTIME: { _text: '819' },
          UID: { _text: '66' },
          XFF: {},
          GRID: { _text: '66' },
          TRIGGERS: { _text: '0' }
        },
        {
          CONNECTTIME: { _text: '3' },
          UID: { _text: '68' },
          XFF: {},
          GRID: { _text: '68' },
          TRIGGERS: { _text: '0' }
        }
      ]
    }
  }
}

【问题讨论】:

  • 两个Object不同,不清楚
  • JSON 的长度是什么意思?您还可以为每种情况添加您期望的正确值吗?您是否试图找到JSON字符串长度的数组长度?
  • 有何不同?你能解释一下吗
  • 嗯,一个是数组,一个是对象。 LISTENER: [] 不是 LISTENER: {}
  • 我正在使用 xml2js(xml to json) 库。如果有多个值,我认为它会转换为这种方式。

标签: javascript node.js json xml2js


【解决方案1】:

您应该尝试在 XML 中进行一些类型定义,否则当您将 xml 转换为 js 时就会发生这种情况。如果 XML 节点只有一个子节点,解析器会自动将其转换为对象。

【讨论】:

  • 我无法更改 XML。
  • 所以必须自己处理。您可以检查它是否是数组。比如 if( Array.isArray(result)) { rs = result; } else { rs = [result.child]} 如果不为空。
【解决方案2】:

我发现了问题。如果有 1 条记录,XMLtoJSON 库将转换为对象。但如果有 2 条或更多条记录,则转换为数组。

所以为了解决这个问题,我们应该在选项中添加alwaysArray: true 属性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-14
    • 2021-06-24
    • 1970-01-01
    • 2021-05-19
    • 2022-01-19
    • 2018-07-19
    相关资源
    最近更新 更多