Erlang: список кортежей в JSON
-
29-09-2019 - |
Вопрос
У меня есть список кортежей, которые являются заголовками 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 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\"}">>
И я попробую это где a - это оригинальный список кортежей:
list_to_binary(mochijson2:encode(A)).
Я подозреваю, что мне нужно получить его в формате, что mochijson2 может интерпретировать лучше. А затем преобразовать в двоичный. Или выяснить способ иметь все символы, представленные как строки (а не имеют некоторые, как список целых чисел).
Значительно ценится, если бы вы могли указать мне в правильном направлении с некотором образец кода.
Решение
Вам нужно преобразовать эти строки внутри там в двоичный до Вы отправляете его в энкодер. Кодер 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]).