2010-10-13 10 views
8

Tengo una lista de tuplas que son encabezados http. Quiero convertir la lista en un objeto JSON. Intento mochijson2 pero fue en vano.Erlang: Lista de Tuple en JSON

Así que tengo el siguiente:

[{'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"}] 

Y le gustaría esto (una cadena JSON binario):

<<"{\"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\"}">> 

Y trato de éste, donde A es la lista original de tuplas:

list_to_binary(mochijson2:encode(A)). 

Sospecho que necesito conseguirlo en un formato que pueda interpretar mejor mochijson2. Y luego convierte a binario. O descubra una forma de tener todos los caracteres representados como cadenas (en lugar de tener algunos como una lista de enteros).

Lo aprecié mucho si me podía orientar en la dirección correcta con algún código de muestra.

Respuesta

7

Necesita convertir esas cadenas adentro en binario antes de lo envía al codificador. El codificador mochijson2 solo considera esto como una lista de enteros y lo envía como una matriz. Así mochijson2 te necesita para convertir {'key', "val"} en {'key', <<"val">>}

Prueba esto en el código:

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]). 

o si lo prefiere el uso de Diversiones:

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

gracias jon! Eso es exactamente lo que estaba buscando. La lista de comprensión está bien y mi preferencia personal. –

0

funciona perfectamente. ¿Qué hay de la lista de tuplas anidadas en json? Modifiqué el código y lo intenté pero fallé. Esto es lo que tengo actualmente. Gracias

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]).