[javascript] URLパラメタをJSON形式に変換
[javascript] URLパラメタをJSON形式に変換:
変換前('&'で改行)
?club_name=Foo+Bar &club.tel=0120-345-678 &club.post=123-4567 &m_id[0]=101 &member[0].sex=2 &member[0].age=30 &m_id[1]=102 &member[1].sex=1 &member[1].age=28 &m_id[2]=103 &member[2].sex=2 &member[2].age=26
変換後(JSON)
{ "club_name": "Foo+Bar", "club": { "tel": "0120-345-678", "post": "123-4567" }, "m_id": [ "101", "102", "103" ], "member": [ { "sex": "2", "age": "30" }, { "sex": "1", "age": "28" }, { "sex": "2", "age": "26" } ] }
実装
test.js
function getParams(search) { var json = {}; search = decodeURIComponent(search); var a = search.split(/[?&]/); a.forEach(function(e,i){ if(e.length<=0) { return; } var ka = e.split('='); var kb = ka[0].split('.'); var kc = kb[0].split(/[\[\]]/); var x = {f:json, g:kc[0]}; parseParam(x, kc[1], []); parseParam(x, kb[1], {}); x.f[x.g] = ka[1]; }) return json; } function parseParam(x, p, n) { if (p !== void 0) { if(x.f[x.g] === void 0){ x.f[x.g] = n; } x.f = x.f[x.g]; x.g = p; } } function test(a, b) { var search = decodeURIComponent(location.search); a.value = search.replace(/&/g, "\n&"); var json = getParams(location.search); b.value = JSON.stringify(json, null, ' '); { var j = {}; j["club_name"] = "Foo+Bar"; j["club"] = {}; j["club"]["tel"] = "0120-345-678"; j["club"]["post"] = "123-4567"; j["m_id"] = []; j["m_id"][0] = "101"; j["m_id"][1] = "102"; j["m_id"][2] = "103"; j["member"] = []; j["member"][0] = {}; j["member"][0]["sex"] = "2"; j["member"][0]["age"] = "30"; j["member"][1] = {}; j["member"][1]["sex"] = "1"; j["member"][1]["age"] = "28"; j["member"][2] = {}; j["member"][2]["sex"] = "2"; j["member"][2]["age"] = "26"; console.log(j); } { var j = { "club_name": "Foo+Bar", "club": { "tel": "0120-345-678", "post": "123-4567" }, "m_id": [ "101", "102", "103" ], "member": [ { "sex": "2", "age": "30" }, { "sex": "1", "age": "28" }, { "sex": "2", "age": "26" } ] }; console.log(j); } }
test.html
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>test</title> <script src="test.js"></script> <style type="text/css"> <!-- table,tr,th,td { border: solid thin; } --> </style> </head> <body onload="test(tarea_a, tarea_b)"> <form name="f1"> <label for="club_name">club_name:</label> <input type="text" id="club_name" name="club_name" value="Foo Bar"> <fieldset style="width: 50%;"> <label for="club.tel">club.tel:</label> <input type="text" id="club.tel" name="club.tel" value="0120-345-678"> <label for="club.post">club.post:</label> <input type="text" id="club.post" name="club.post" value="123-4567"> </fieldset> <table> <tr> <th>会員番号</th> <th>氏名</th> <th>性別</th> <th>年齢</th> <th>職業</th> </tr> <tr> <td> <input type="number" id="m_id0" name="m_id[0]" value="101"> </td> <td>佐藤 一郎</td> <td> <input type="radio" id="member0.sex.m" name="member[0].sex" value="1">男 <input type="radio" id="member0.sex.f" name="member[0].sex" value="2" checked="true">女 </td> <td> <input type="number" id="member0.age" name="member[0].age" value="30"> </td> <td>自営業</td> </tr> <tr> <td> <input type="number" id="m_id1" name="m_id[1]" value="102"> </td> <td>山田 次郎</td> <td> <input type="radio" id="member1.sex.m" name="member[1].sex" value="1" checked="true">男 <input type="radio" id="member1.sex.f" name="member[1].sex" value="2">女 </td> <td> <input type="number" id="member0.age" name="member[1].age" value="28"> </td> <td>公務員</td> </tr> <tr> <td> <input type="number" id="m_id2" name="m_id[2]" value="103"> </td> <td>鈴木 花子</td> <td> <input type="radio" id="member2.sex.m" name="member[2].sex" value="1">男 <input type="radio" id="member2.sex.f" name="member[2].sex" value="2" checked="true">女 </td> <td> <input type="number" id="member0.age" name="member[2].age" value="26"> </td> <td>会社員</td> </tr> </table> <input type="submit"> </form> <p style="display:inline-block"> <label for="tarea_a">変換前('&'で改行):</label><br> <textarea id="tarea_a" name="tarea_a" cols="30" rows="15"></textarea> </p> <p style="display:inline-block"> <label for="tarea_b">変換後(JSON):</label><br> <textarea id="tarea_b" name="tarea_b" cols="30" rows="15"></textarea> </p> </body> </html>
コメント
コメントを投稿