2010-10-13 13 views
8

Mam listę krotek, które są nagłówkami http. Chcę przekonwertować listę na obiekt JSON. Próbuję mochijson2, ale bezskutecznie.Erlang: Lista Tuple do JSON

Więc mam następujące:

[{'Accept',"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"}, 
{'Accept-Charset',"ISO-8859-1,utf-8;q=0.7,*;q=0.7"}, 
{'Accept-Encoding',"gzip,deflate"}, 
{'Accept-Language',"en-us,en;q=0.5"}, 
{'Cache-Control',"max-age=0"}, 
{'Connection',"close"}, 
{'Cookie',"uid=CsDbk0y1bKEzLAOzAwZUAg=="}, 
{'User-Agent',"Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.2.10) Gecko/20100914 Firefox/3.6.10"}] 

i chciałbym to (binarne JSON ciąg znaków):

<<"{\"Accept\":\"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\", 
\"Accept-Charset\":\"ISO-8859-1,utf-8;q=0.7,*;q=0.7\", 
\"Accept-Encoding\":\"gzip,deflate\", 
\"Accept-Language\":\"en-us,en;q=0.5\", 
\"Cache-Control\":\"max-age=0\", 
\"Connection\":\"close\", 
\"Cookie\":\"uid=CsDbk0y1bKEzLAOzAwZUAg==\", 
\"User-Agent\":\"Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.2.10) Gecko/20100914 Firefox/3.6.10\"}">> 

I próbuję to gdzie A jest oryginalna lista krotek:

list_to_binary(mochijson2:encode(A)). 

Podejrzewam, że muszę ustawić go w formacie, który mochijson2 może lepiej zinterpretować. A następnie przekonwertuj na plik binarny. Lub wymyślić sposób, aby wszystkie znaki były reprezentowane jako łańcuchy (zamiast niektórych jako listy liczb całkowitych).

Bardzo doceniam, jeśli możesz wskazać mi właściwy kierunek z przykładowym kodem.

Odpowiedz

7

Musisz przekonwertować te ciągi wewnątrz tam na binarne przed wysyłać je do kodera. Enkoder mochijson2 uważa to za listę liczb całkowitych i wyprowadza ją jako tablicę. Więc mochijson2 musi konwertować {'key', "val"} do {'key', <<"val">>}

Spróbuj to w kodzie:

Original = [ 
    {'Accept-Charset',"ISO-8859-1,utf-8;q=0.7,*;q=0.7"}, 
    {'Accept-Encoding',"gzip,deflate"} 
]. 
StingConverted = [ {X,list_to_binary(Y)} || {X,Y} <- Original ]. 
Output = mochijson2:encode(StingConverted). 
io:format("This is correct: ~s~n", [Output]). 

Lub jeśli wolisz korzystać funs:

Original = [ 
    {'Accept-Charset',"ISO-8859-1,utf-8;q=0.7,*;q=0.7"}, 
    {'Accept-Encoding',"gzip,deflate"} 
]. 
ConvertFun = fun({X,Y}) -> {X,list_to_binary(Y)} end. 
StingConverted = lists:map(ConvertFun, Original). 
Output = mochijson2:encode(StingConverted). 
io:format("This is correct: ~s~n", [Output]). 
+0

dzięki jon! Właśnie tego szukałem. Zrozumienie listy jest w porządku i moje osobiste preferencje. –

0

działa idealnie. Co powiesz na zagnieżdżoną listę krotek w json? Zmodyfikowałem kod i wypróbowałem, ale nie udało się. To właśnie mam obecnie. Dzięki

Nested Tuples List 
------------------ 
Original = [ 
    {'Accept-Charset',"ISO-8859-1,utf-8;q=0.7,*;q=0.7"}, 
    {'Accept-Encoding',"gzip,deflate"}, 
    {'Nested-List', [ 
    {'Accept-Charset',"ISO-8859-1,utf-8;q=0.7,*;q=0.7"}, 
    {'Accept-Encoding',"gzip,deflate"} 
    ]}], 

ConvertFun = fun({X,Y}) -> {X, case is_list(Y) of 
    true -> 
     Elem = lists:nth(1,Y), 
     case is_tuple(Elem) of 
      true -> 
       demo_json(Y); 
      false -> 
       list_to_binary(Y) 
     end; 
    false -> 
     Y 
end. 
} end, 
StingConverted = lists:map(ConvertFun, Original), 
Output = mochijson2:encode(StingConverted), 
io:format("This is correct: ~s~n", [Output]).