7

mochijson2 を使用して一部のデータをエンコードしています。しかし、リストとしての文字列では奇妙な動作をすることがわかりました。

例:

mochijson2:encode("foo").

[91,"102",44,"111",44,"111",93]

"102"、"111"、"111" は、文字列としてエンコードされた $f、$o、$o です。44 はカンマ、91 と 93 は角括弧です。

もちろん、これをどこかに出力すると、文字列「[102,111,111]」が得られますが、これは明らかに私が何をしているのかではありません。

私が試したら

mochijson2:encode(<<"foo">>).

[34,<<"foo">>,34]

だから私は再び2つの二重引用符とバイナリ部分のリストを取得し、その中でlist_to_binary/1でバイナリに変換できます

ここに問題があります - なぜそれほど矛盾しているのか。json配列としてエンコードする必要があるerlangリストとjson文字列としてエンコードする必要があるerlang文字列を区別する問題があることは理解していますが、少なくともバイナリを渡すとバイナリを出力できますか?

そして 2 番目の質問: mochijson がすべて適切に出力するように見えます (特殊なタプルを使用して配列 {array, ...} を指定するため)。

mochijson:encode(<<"foo">>).
"\"ふー\""

mochijson2 と mochijson の違いは何ですか? パフォーマンス?ユニコード扱い?他に何か?

ありがとう

4

1 に答える 1

7

私の推測では、mochijson での決定は、バイナリを文字列として扱い、整数のリストを整数のリストとして扱うということです。(Un?)幸いなことに、Erlang の文字列は実際には整数のリストです。

その結果、「foo」、つまり [102,111,111] は、「[102,111,111]」を表すテキストに変換されます。2 番目のケースでは、 <<"foo">> 文字列は "foo" になります。

2 番目の質問に関しては、mochijson は常に文字列を返すようですが、mochijson2 はiodata型を返します。Iodata は基本的に、文字列、バイナリ、および iodata (実際には iolist) の再帰的なリストです。結果を「ワイヤを介して」送信するだけの場合は、フラットな文字列に変換するよりも、リストに入れ子にする方が効率的です。

于 2009-10-13T19:46:01.307 に答える