2009-07-14 10 views
6

Tôi đang sử dụng mochiweb và tôi không biết cách sử dụng bộ mã hóa json của nó để xử lý cấu trúc dữ liệu phức tạp. Sự khác nhau giữa mochijson và mochijson2 là gì? Có ví dụ nào tốt không? Tôi luôn gặp các lỗi sau:Làm thế nào để sử dụng mochijson để mã hóa cấu trúc dữ liệu trong erlang?

46> T6={struct,[{hello,"asdf"},{from,"1"},{to,{a,"aa"}}]}. 
{struct,[{hello,"asdf"},{from,"1"},{to,{a,"aa"}}]} 
47> mochijson2:encode(T6).         
** exception exit: {json_encode,{bad_term,{a,"aa"}}} 
    in function mochijson2:json_encode/2 
    in call from mochijson2:'-json_encode_proplist/2-fun-0-'/3 
    in call from lists:foldl/3 
    in call from mochijson2:json_encode_proplist/2 


39> T3={struct,[{hello,"asdf"},{[{from,"1"},{to,"2"}]}]}. 
{struct,[{hello,"asdf"},{[{from,"1"},{to,"2"}]}]} 
40> mochijson:encode(T3).         
** exception error: no function clause matching mochijson:'-json_encode_proplist/2-fun-0-'({[{from,"1"},{to,"2"}]}, 
                          [44,"\"asdf\"",58,"\"hello\"",123], 
                          {encoder,unicode,null}) 
    in function lists:foldl/3 
    in call from mochijson:json_encode_proplist/2 

Trả lời

11

mochijson2 hoạt động với chuỗi dưới dạng nhị phân, liệt kê dưới dạng mảng và chỉ giải mã UTF-8. mochijson giải mã và mã hóa các điểm mã unicode.

Để tạo một cấu trúc sâu Tôi đã làm như sau:

2> L = {struct, [{key2, [192]}]}. 
{struct,[{key2,"?"}]} 
3> 
3> L2 = {struct, [{key, L}]}. 
{struct,[{key,{struct,[{key2,"?"}]}}]} 
4> 
4> mochijson:encode(L2). 
[123,"\"key\"",58, 
[123,"\"key2\"",58,[34,"\\u00c0",34],125], 
125] 

Vì vậy, nếu bạn đệ quy tạo ra cấu trúc dữ liệu của bạn sử dụng danh sách sau đó bạn sẽ ổn thôi. Tôi không chắc tại sao các cấu trúc sâu không được hỗ trợ, nhưng dường như chúng không có vẻ, ít nhất không phải là cách bạn đang cố gắng tạo ra chúng. Có thể ai đó khác biết cách thông minh hơn để làm điều này.

Bạn cũng có thể kiểm tra chủ đề này: mochijson2 examples!

hoặc

http://beebole.com/en/blog/erlang/tutorial-web-application-erlang/

4

T6 = {struct, [{hello, "asdf"}, {từ, "1"}, { đến, {a, "aa"}}]}. Thay vào đó,
phải là
T6 = {struct, [{hello, "asdf"}, {từ, "1"}, {đến, {struct, [{a, "aa"}]}}]}.

Cấu trúc lồng nhau cần phải có cùng kiểu "struct" làm đối tượng cấp cao nhất.