JavaScriptの連想配列hogeをJSONデータに変換するための具体的なコードはありませんか?

回答の条件
  • URL必須
  • 1人1回まで
  • 登録:2006/12/22 10:16:45
  • 終了:2006/12/29 10:20:02

回答(2件)

id:susie-t No.1

susie-t回答回数99ベストアンサー獲得回数182006/12/22 22:18:45

ポイント35pt

以下のようなことでしょうか?

<html>
<head>
<title></title>
<script language="javascript">
<!--
var hoge = {
  one : '壱',
  tow : '弐',
  three : '参',
  dquot : '"'
};
function makeJSON(hash){
  var init = true;
  var str = '{';
  for(var i in hash){
    if(!init) str += ',';
    str += '"' + i.replace('"', '\\"', 'g') + '":"';
    str += hash[i].replace('"', '\\"', 'g') + '"';
    init = false;
  }
  str += '}';
  return str;
}
alert(makeJSON(hoge));
//-->
</script>
</head>
<body>
</body>
</html>

ダミー:http://q.hatena.ne.jp/

id:P-mako

サンプル作成ありがとうございます。

シンプルなソースですね。

ただ、対象の連想配列が多次元になるので、リカーブル(再帰的)な関数だとうれしいです。

(自分で改修しろっていう感じですが・・・)

2006/12/23 00:23:45
id:talepanda No.2

talepanda回答回数57ベストアンサー獲得回数122006/12/24 15:33:30

ポイント35pt

JSONの公式サイトにjson.jsというオープンソースコードがあります。

<script type="text/javascript" src="json.js"></script>
<script type="text/javascript">
var myJSONObject = {"bindings": [
        {"ircEvent": "PRIVMSG", "method": "newURI", "regex": "^http://.*"},
        {"ircEvent": "PRIVMSG", "method": "deleteURI", "regex": "^delete.*"},
        {"ircEvent": "PRIVMSG", "method": "randomURI", "regex": "^random.*"}
    ]
};
document.write(myJSONObject.toJSONString());
</script>

プロトタイプが汚染されるのがいやなら、json.jsの中の必要なところだけを引数をとる関数にしてしまえばよいかと。

http://www.json.org/js.html

http://www.json.org/json.js

id:P-mako

json.jsで、toJSONStringなんていうメソッドがあったんですね。

サンプルは確かに動作しましたが、以下のようなソースの場合、連想配列urlの中身が表示されず、空の{}の羅列が得られます。

{{}:{{}:{{}:{},{}:{},{}:{},{}:{}}},{}:{{}:{{}:{},{}:{},{}:{},{}:{}}},{}:{{}:{{}:{},{}:{},{}:{},{}:{},{}:{}}},{}:{{}:{{}:{},{}:{},{}:{},{}:{}}},{}:{{}:{{}:{},{}:{},{}:{}}},{}:{{}:{{}:{}}}}

◆ソース

<html>

<head>

<script type="text/javascript" src="json.js"></script>

<script type="text/javascript" src="./prototype.js"></script>

<script language="JavaScript"></p> <p>function test()</p> <p>{</p> <p>var urllist;</p> <p>var element;</p> <p>urllist = form1.urllist.value;</p> <p>url = urllist.split("\n");</p> <p>for( i = 0; i < url.length; i++ ){</p> <p>element = url[i].split("\\");</p> <p>url[i] = new Array();</p> <p>url[i]["element"] = element;</p> <p>}</p> <p>//alert(url.toJSONString());</p> <p>form1.output.value=url.toJSONString();</p> <p>}</p> <p></script>

</head>

<body>

<form name="form1">

<input type="button" onClick="test()" value="test" />

<textarea name="urllist" cols="100" rows="10"></p> <p>C:\hoge\foo\aaa.html</p> <p>C:\hoge\foo\bbb.html</p> <p>C:\hoge\foo\bar\ccc.html</p> <p>C:\hoge\hogehoge\123.html</p> <p>C:\hoge\456.html</p> <p></textarea>

<textarea name="output" cols="100" rows="10"></p> <p></textarea>

</form>

</html>

</body>

2006/12/28 20:39:32
  • id:susie-t
    回答回数が一回で、コメントもつけられなかったので・・・。
    いちおう、再帰的にしたものを提示します。
    最後の2つのalertは、取得した文字列をevalで処理したものです。
    >||
    <html>
    <head>
    <title></title>
    <script language="javascript">
    <!--
    var hoge = {
    one : '壱',
    tow : '弐',
    three : '参',
    dquot : '"',
    obj:{
    child1:'子1',
    child2:'子2',
    obj:{
    child1:'子の子1',
    child2:'子の子2'
    }
    },
    func : function(){
    alert("!");
    }
    };
    function makeJSON(hash){
    var init = true;
    var str = '{';
    for(var i in hash){
    if(!init) str += ',';
    str += '"' + i.replace('"', '\\"', 'g') + '":';
    switch(typeof hash[i]){
    case 'object':
    str += makeJSON(hash[i]);
    break;
    case 'function':
    str += hash[i].toString();
    break;
    default:
    str += '"' + hash[i].toString().replace('"', '\\"', 'g') + '"';
    }
    init = false;
    }
    str += '}';
    return str;
    }
    var json = makeJSON(hoge);
    alert(json);
    var hoge2 = eval('(' + json + ')');
    alert(hoge2.obj.obj.child2);
    hoge2.func();
    //-->
    </script>
    </head>
    <body>
    </body>
    </html>
    ||<

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません