2010-10-13 11 views
8

Ich habe eine Liste von Tupeln, die HTTP-Header sind. Ich möchte die Liste in ein JSON-Objekt konvertieren. Ich versuche Mochijson2, aber ohne Erfolg.Erlang: Tupel Liste in JSON

So habe ich die folgenden:

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

Und möchte diese (eine binäre JSON-String):

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

Und ich versuche, dies in der A die ursprüngliche Liste von Tupeln ist:

list_to_binary(mochijson2:encode(A)). 

Ich vermute, ich muss es in ein Format bekommen, das mochijson2 besser interpretieren kann. Und dann in Binär konvertieren. Oder finden Sie heraus, wie alle Zeichen als Zeichenfolgen dargestellt werden können (anstatt einige als Liste von ganzen Zahlen zu haben).

Sehr geschätzt, wenn Sie mir mit einem Beispielcode in die richtige Richtung zeigen könnten.

Antwort

7

Sie müssen diese Zeichenfolgen dort in Binär vor konvertieren, die Sie an den Encoder senden. Der mochijson2-Encoder betrachtet dies einfach als eine Liste von ganzen Zahlen und gibt sie als ein Array aus. So mochijson2 braucht man {'key', "val"} in {'key', <<"val">>}

Versuchen Sie dies in Ihrem Code zu konvertieren:

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

Oder wenn Sie es vorziehen, mit 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

danke jon! Genau das habe ich gesucht. Das Listenverständnis ist in Ordnung und meine persönliche Vorliebe. –

0

perfekt funktioniert. Wie wäre es mit geschachtelten Tuple-Listen in JSON? Ich habe den Code geändert und es versucht, aber es ist fehlgeschlagen. Dies ist, was ich derzeit habe. Danke

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