2009-10-13 17 views
7

Tôi đang mã hóa một số dữ liệu bằng cách sử dụng mochijson2. Nhưng tôi thấy rằng nó hoạt động lạ trên chuỗi như danh sách.mochijson2 hoặc mochijson

Ví dụ:

mochijson2: mã hóa ("foo").

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

đâu "102", "111", "111" là $ f, $ o, $ o được mã hóa dưới dạng các chuỗi 44 là dấu phẩy và 91 và 93 là các ô vuông.

Tất nhiên nếu tôi xuất ra nơi này, tôi sẽ nhận được chuỗi "[102,111,111]" rõ ràng không phải là những gì tôi làm gì.

Nếu tôi cố gắng

mochijson2: mã hóa (< < "foo" >>).

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

Vì vậy, tôi một lần nữa tôi nhận được một danh sách của hai doublequotes và phần nhị phân trong đó có thể được dịch sang nhị phân với list_to_binary/1

Đây là câu hỏi - tại sao nó không phù hợp. Tôi hiểu rằng có một vấn đề distingushing erlang danh sách mà nên được mã hóa như json mảng và chuỗi erlang cần được mã hóa như json chuỗi, nhưng ít nhất nó có thể đầu ra nhị phân khi tôi vượt qua nó nhị phân?

Và câu hỏi thứ hai: Hình như mochijson kết quả đầu ra tất cả mọi thứ tốt đẹp (vì nó sử dụng tuple đặc biệt để chỉ định mảng {array, ...})

mochijson: mã hóa (< < "foo" >>).
"\" foo \ ""

Sự khác nhau giữa mochijson2 và mochijson là gì? Hiệu suất? Xử lý Unicode? Còn gì nữa không?

Cảm ơn

Trả lời

7

đoán của tôi là quyết định trong mochijson là nó đối xử với một nhị phân là một chuỗi, và nó xử lý một danh sách các số nguyên như một danh sách các số nguyên. (Un?) May mắn thay các chuỗi trong Erlang thực chất là một danh sách các số nguyên.

Kết quả là "foo" của bạn hoặc nói cách khác, [102,111,111] của bạn được dịch thành văn bản đại diện cho "[102,111,111]". Trong trường hợp thứ hai, chuỗi < < "foo" >> của bạn trở thành "foo"

Về câu hỏi thứ hai, mochijson dường như luôn trả về một chuỗi, trong khi mochijson2 trả về loại iodata. Iodata về cơ bản là một danh sách đệ quy của chuỗi, nhị phân và i-ốt (trong thực tế là iolists). Nếu bạn chỉ có ý định gửi kết quả "thông qua dây", nó sẽ hiệu quả hơn khi chỉ lồng chúng vào một danh sách hơn là chuyển chúng thành một chuỗi phẳng.

+0

Cảm ơn câu trả lời của bạn, nhưng vẫn chưa rõ mọi thứ. Tôi đoán: trường hợp thứ hai của bạn <<"foo">> chuỗi trở thành "foo" không đúng hoặc [34, <<"foo">>, 34] tương đương với "foo"? hỗ trợ utf-8 trong mochijson là gì? khi tôi sử dụng mochijson2 tôi đã thêm {utf8, true} vào bộ mã hóa. –

+3

Thử xóa: iolist_to_binary ([34, <<"foo">>, 34]). 34 là một ký tự đơn, <<"foo">> là ba ký tự chuỗi dài foo (w/o "), và số 34 là số khác". – Zed

+0

Bất kể lời giải thích của bạn về i-ốt có một vấn đề khác. "Foo" không hợp lệ JSON và không thể dịch sang JSON hợp lệ –