LoginSignup
0
0

More than 3 years have passed since last update.

json(object) to form-encoded

Last updated at Posted at 2019-05-03

ふとform-encodedなpostリクエストをしたくなったのですが、みんなjsonの事ばっかり考えていて困ったことがあったので備忘

※URIエンコードの予約文字回避(2019/5/17)

やりたい事

javascriptのobjectをx-www-form-urlencodedなbodyに変えたい
↓こんなのを

objcect.js
var obj = {
    first: {
        firstA:"a",
        firstB:"b"
    },
    second: "seconds",
    third: {
        thirdA: {
            thirdAA: "aaa",
            thirdAB: "bbb"
        },
        thirdB: "bbb"
    }
}

↓こんなのに

string.js
first%5BfirstA%5D=a&first%5BfirstB%5D=b&second=seconds&third%5BthirdA%5D%5BthirdAA%5D=aaa,third%5BthirdA%5D%5BthirdAB%5D=bbb&third%5BthirdB%5D=bbb

こうした

色々パターン考えかったんですけど、脳みそパワー不足で1パターンのみなンだわ

result.js
  public createFormEncordedBody(obj) {
    let keys = [];
    let ret = [];
    for (const key in obj) {
      if (typeof obj[key] === "object") {
        keys.push(key);
        ret = ret.concat(this.encodedLoop(keys, obj[key]));
        keys = [];
      } else {
        ret.push(encodeURIComponent(key) + "=" + encodeURIComponent(obj[key]));
      }
    }
    return ret.join("&");
  }

  public encodedLoop(keys, obj) {
    if (typeof obj === "object") {
      const ret = [];
      for (const key in obj) {
        keys.push(key);
        ret.push(this.encodedLoop(keys, obj[key]));
        keys.pop();
      }
      return ret.join("&");
    } else {
      let str = "";
      for (const k in keys) {
        if (k === "0") {
          str += keys[k];
        } else {
          str += encodeURIComponent("[" + keys[k] + "]");
        }
      }
      str += "=" + encodeURIComponent(obj);
      return str;
    }
  }

助けて

汎用的に書く意味は全く無く、普通jsonだしformでもエンドポイントごとに整形すればいいじゃん。

もっとかっこよくイテラブルにやったりしたい。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0