Erlang: список кортежей в JSON - PullRequest
8 голосов
/ 13 октября 2010

У меня есть список кортежей, которые являются заголовками 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\"}">>

И я пытаюсь это сделать, где А - это исходный список кортежей:

list_to_binary(mochijson2:encode(A)).

Я подозреваю, что мне нужно перевести его в формат, который mochijson2 может интерпретировать лучше. А затем преобразовать в двоичный файл. Или найдите способ, чтобы все символы были представлены в виде строк (а не в виде целых чисел).

Буду очень признателен, если вы укажете мне правильное направление, используя пример кода.

Ответы [ 2 ]

7 голосов
/ 13 октября 2010

Вам нужно преобразовать эти строки внутри двоичного файла до того, как вы отправите их кодировщику. Кодер 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]).
0 голосов
/ 26 июня 2012

Работает отлично.Как насчет вложенного списка Tuple в 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]).
...