JSON形式からForm形式へ変換した

JSON

APIサーバーとの結合を目前にしたところで、形式をapplication/jsonからmultipart/form-dataに変更しなければならない事案が発生したので、フォーマッターを作った時のメモ。

JS系パッケージに既に山ほどありそう。

まさに車輪の再発明だと思いますが、ソースコード載せておきます。

import _ from 'lodash'

export const jsonToForm = (params, formData, name = '') => {
  if (_.isArray(params)) formatArray(params, formData, name);
  if (_.isPlainObject(params)) formatObject(params, formData, name);
  return formData;
}

export const formatObject = (params, formData, name) => {
  _.forEach(params, (v, k) => {
    if (_.isArray(v) || _.isPlainObject(v)) {
      jsonToForm(v, formData, !name ? k : `${name}.${k}`);
      return;
    }
    formData.append(!name ? k : `${name}.${k}`, v);
  })
}

export const formatArray = (params, formData, name) => {
  _.map(params, (data, index) => {
    if (_.isArray(data) || _.isPlainObject(data)) {
      jsonToForm(data, formData, `${name}[${index}]`);
      return;
    }
    formData.append(`${name}[${index}]`, data);
  });
  return formData;
}
// 使う時
const formattedData = jsonToForm(jsonParams, new FormData())

標準と何ら変わらないものばかりですが、Lodashを使って実装してます。

実際のプロジェクトではTypeScriptで書きましたが、型問題結構面倒でした。

こういったことをすることはもう当分なさそうですが、もっといい書き方などあれば教えてください。