とあるAPIで返ってくるレスポンスがXML形式だったため、jsonに変換したくて方法を探していたところ、
xmlをjsonに変換できる「xml2js」というモジュールがあることが分かったので、実際に使ってみました。
xml2jsをインストール
まず初めにxml2jsをインストールします。
$ npm install xml2js
そして、xml2jsをrequireでインポートします。
const xml2js = require('xml2js');
この時、Typescriptを使っていたので、エディタ上で下記のようなエラーが出ました。
ESLint: Require statement not part of import statement.(@typescript-eslint/no-var-requires)
これを回避するには、@types/xml2js
をインストールして、それをインポートします。
$ npm install --save @types/xml2js
import xml2js from 'xml2js';
これでエラー回避できました。
あとのところは下記記事を参考に実装し、問題なくXMLデータをjsonに変換することができました。
参考にさせていただいた記事:
Node.js + axios で XMLのレスポンスを扱う
難点
このxml2jsを使って一つ躓いたのが、jsonの形式です。
今回、APIを叩いて返ってくるデータが1つだったり、複数だったり様々なパターンのものでした。
例
[
{
apple: りんご,
banana: バナナ,
orange: みかん
},
{
apple: りんご,
banana: バナナ,
orange: みかん
}
]
このように、xmlからjson形式に変換した後、複数データの時は配列で返ってくるのですが、
1つのデータだった場合は、配列ではなくobjectになっていました。
例
{
apple: りんご,
banana: バナナ,
orange: みかん
}
この後のコードで繰り返し処理(map)させたかったので、objectだとエラーになってしまいます。
xml2jsのオプションの中にexplicitArray
というものがあったので、
なんとなくこれをtrueにしてみましたが
[
{
apple: [りんご],
banana: [バナナ],
orange: [みかん]
}
]
なんでそんなことになるん?????となったので、
面倒ですがレスポンスデータが配列の時とオブジェクトの処理の時を条件分岐させることにしました。
配列で返ってくるように選択できればいいのにな・・・