Длина JSON, дающая неверное значение

#javascript #node.js #json #xml2js

Вопрос:

Я хочу получить длину JSON, но это не дает нужных значений. Я использую библиотеку преобразования XML в JSON (xml2js). Если вы знаете другую библиотеку, чем xml2js. Я тоже могу им воспользоваться.

console.log(результат.длина) -> Возвращает значение >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(результат.длина) -> Возвращает значение 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 */))
 

ответ.данные-это ответ на запрос get(с использованием библиотеки 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' }
        }
      ]
    }
  }
}
 

Комментарии:

1. Эти два Объекта различны, неясны

2. Что вы имеете в виду под длиной JSON? Можете ли вы также добавить, какие, по вашему мнению, правильные значения должны быть для каждого сценария? Вы пытаетесь найти длину массива длины строки JSON?

3. Чем это отличается? Не могли бы вы объяснить, пожалуйста

4. Один — это массив, другой-объект. LISTENER: [] не является LISTENER: {}

5. Я использую библиотеку xml2js(xml в json). Я думаю, что он преобразуется таким образом, если существует несколько значений.

Ответ №1:

Вы должны попробовать какое-то определение типа в XML, или это произойдет при преобразовании xml в js. Если XML-узел имеет только одного потомка, синтаксический анализатор автоматически преобразует его в объект.

Комментарии:

1. Я не могу изменить XML.

2. Так что ты должен справиться с этим сам. Вы можете проверить, является ли это массивом или нет. например, если( массив.isArray(результат)) { rs = результат; } еще { rs = [результат.дочерний]} в случае, если значение не равно нулю.

Ответ №2:

Я нашел проблему. Библиотека XMLtoJSON преобразуется в объект, если имеется 1 запись. Но если есть 2 или более записей, они преобразуются в массив.

Поэтому, чтобы исправить это, мы должны добавить alwaysArray: true атрибут в параметры.