RFC 6901 JSONポインター ?
チルダ(\u007e)でハマってしまった。今日の睡眠時間2時間。完全にボケている。
<!DOCTYPE html> <title>RFC 6901 JSONポインター</title> <meta charset="UTF-8"/> <style> </style> <body> <h1>RFC 6901 JSONポインター</h1> <h2>tools.ietf.org/html/rfc6901</h2> <p> <textarea cols="30" rows="12"> //以下を JSON として扱う { "foo": ["bar", "baz"], "": 0, "a/b": 1, "c%d": 2, "e^f": 3, "g|h": 4, "i\\j": 5, "k\"l": 6, " ": 7, "m~n": 8 } </textarea> <textarea cols="30" rows="12"> //取り出すためのパラメータ [ "/foo", "/foo/0", "/", "/a~1b", "/c%d", "/e^f", "/g|h", "/i\\j", "k\"l", "/ ", "/m~0n" ] </textarea> <textarea cols="30" rows="12"> </textarea> <p> <input type="text" id="fragment" value=""> <input type="button" value="Test" onclick="demo();"> </p> <p> result:<br> <textarea cols="30" rows="2"></textarea> </p> <script> (function () { var or = "|"; var identifier = "\\u002F"; var unicode = "[\\u0000-\\u002E\\u0030-\\u10FFFF]"; var other = "(.*|$)"; var reg_str = "^" + identifier + "?(" + unicode + "+)?" + other; var token_parser = new RegExp (reg_str); var escaped1 = /(~0*1)/g; var escaped0 = /(~0)/g; function pointerParse (json, fragment) { var result = json; var parse = fragment; var token; var pointer; while (parse) { token = token_parser.exec (parse); if (! token) throw new Error; pointer = (token[1]) ? token[1].replace (escaped1, '\u002F').replace (escaped0, '\u007E') // ~, / : ''; result = result[pointer]; parse = token[2]; } return result; } this.JSON_Pointer = pointerParse; }) (); //検証 var view = document.querySelectorAll ('textarea'); var json = eval ('(' + view[0].value + ')'); var frgm = eval ('(' + view[1].value + ')'); view[2].value = "// 取り出した結果\n[\n" + frgm.map (function (q) { return " " + [q, JSON_Pointer (this, q)].join (" \t= "); }, json).join ("\n") + "\n]"; function demo () { view[3].value = JSON_Pointer (json, document.querySelector ('#fragment').value); } </script>