Erlang: список кортежей в JSON
у меня есть список кортежей, которые являются заголовками http. Я хочу преобразовать список в объект JSON. Я пытаюсь mochijson2, но безрезультатно.
поэтому у меня есть следующее :
[{'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"}]
и хотел бы это (двоичная строка JSON):
<<"{"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"}">>
и я пробую это, где A-исходный список кортежей:
list_to_binary(mochijson2:encode(A)).
Я подозреваю, что мне нужно получить его в формате, который mochijson2 может интерпретировать лучше. А затем преобразовать в двоичный. Или найти способ чтобы все символы были представлены как строки (а не как список целых чисел).
очень признателен, если вы могли бы указать мне в правильном направлении с некоторым образцом кода.
2 ответов
нужно преобразовать эти строки в двоичном до вы отправляете его на энкодер. Кодировщик mochijson2 просто рассматривает это как список целых чисел и выводит его как массив. Так mochijson2 нуждается в вас, чтобы преобразовать{'key', "val"}
на {'key', <<"val">>}
попробуйте это в ваш код:
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]).
или если вы предпочитаете использовать 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]).
работает отлично. Как насчет вложенного списка кортежей в json? Я изменил код и попробовал, но не смог. Это то, что у меня сейчас есть. Спасибо
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]).