2009-10-13 41 views
7

我使用mochijson2編碼一些數據。 但是我發現它在列表中的行爲很奇怪。mochijson2或mochijson

實施例:

mochijson2:編碼( 「foo」 的)。

[91, 「102」,44, 「111」,44, 「111」,93]

其中 「102」, 「111」, 「111」 是$ F,$ O, $ o編碼爲字符串 44是逗號,91和93是方形的配件。

當然,如果我輸出這個地方,我會得到字符串「[102,111,111]」,這顯然不是我所爲。

,如果我嘗試

mochijson2:編碼(< < 「FOO」 >>)。

[34,< < 「foo」 的>>,34]

所以我再次我得到內其可以被轉化爲二進制與list_to_binary/1

2雙引號和二進制部分的列表

這是一個問題 - 爲什麼它如此不一致。我知道有一個問題應該被編碼爲json數組和erlang字符串,應該被編碼爲json字符串,但至少可以在我傳遞二進制文件時輸出二進制文件嗎?

而第二個問題: 看起來mochijson輸出一切美好的事物(因爲它使用特殊的元組指定數組{陣列,...})

mochijson:編碼(< < 「FOO」 >> )。
「\」 福\ 「」

什麼mochijson2和mochijson之間的區別?性能? Unicode處理?還要別的嗎?

感謝

回答

7

我的猜測是,在mochijson的決定是,它把一個二進制的字符串,它把一列整數作爲整數列表。 (Un?)幸運的是,Erlang中的字符串實際上是一個整數列表。

因此,您的「foo」或換句話說,您的[102,111,111]被翻譯成代表「[102,111,111]」的文本。在第二種情況下,你< <「FOO」 >>字符串變成「富」

關於第二個問題,mochijson似乎總是返回一個字符串,而mochijson2返回iodata類型。 Iodata基本上是一個字符串,二進制文件和iodatas(實際上是iolists)的遞歸列表。如果您只打算通過「連線」發送結果,將它們嵌套到列表中比將其轉換爲扁平字符串更有效。

+0

感謝您的回答,但仍不是一切都清楚。 我想:第二種情況你的<<"foo">>字符串變成「foo」不是真的,或者[34,<<"foo">> 34]等價於「foo」? mochijson支持utf-8呢? 當我使用mochijson2我向編碼器添加了{utf8,true}選項。 – 2009-10-13 21:56:10

+3

嘗試erlang:iolist_to_binary([34,<<"foo">>,34])。 34是單個「字符,<<"foo">>是三字符長字符串foo(w/o」),而34是另一個「。 – Zed 2009-10-14 05:45:47

+0

無論你對iodata的解釋還有另一個問題。」foo「是無效的JSON並且無法翻譯成有效的JSON – 2009-10-14 15:30:41