如何转换json格式的erlang varible

时间:2016-06-16 05:30:57

标签: erlang

要在json中发送erlang数据,可以通过以下方式完成:

ReqBody = << "{\"snippet\":\"Body\" }" >>

但如果我有一个像

这样的变量
Temp = "data from erlang" 

如何以这种格式添加Temp?

4 个答案:

答案 0 :(得分:3)

为了生成JSON,你绝对应该使用一个比你自己的代码更好测试的JSON库。我可以推荐纯Erlang jsone或NIF jiffy。不要忘记他们每个人都需要将你的术语转换为适当的结构。

答案 1 :(得分:1)

>T = {"Temp","data from erlang"}.
>t2j:t2jp(T).
{"Temp":"data from erlang")

您可以使用my tuple to json module或许多其他人之一。

答案 2 :(得分:-1)

您可以通过http://erlang.org/doc/man/erlang.html#list_to_binary-1

转换Temp

然后再做同样的事。

答案 3 :(得分:-1)

我避免通过字符串连接生成JSON。除非你非常仔细地验证输入,否则有人可能(有意或无意)潜入一个字符串中的引用并打破一切。

如果您要解析并生成JSON,我建议您使用Erlang的一个开源JSON库。

如果您只需要生成JSON,那么您可能不需要库。你可以使用这样的东西作为起点(警告经纪人:未经测试的代码,可能有很多错误)

encode(Term) ->
    iolist_to_binary(encode1(Term)).

encode1(Term) when is_binary(Term) -> Term;
encode1(true) -> <<"true">>;
encode1(false) -> <<"false">>;
encode1(Term) when is_atom(Term) -> encode1(atom_to_list(Term));
encode1(Term) when is_integer(Term) -> list_to_binary(integer_to_list(Term));
encode1(Term=[{_, _}|_]) -> % assume object if it starts with a tuple
    [<<"{">>,
     join([[encode1(K), <<":">>, encode1(V)] || {K, V} <- Term], <<",">>),
     <<"}">>];
encode1(Term) when is_list(Term) ->
    case io_lib:printable_list(Term) of
        true ->
            [list_to_binary(io_lib:format("~p", [Term]))];
        false ->
        [<<"[">>, join([encode1(T) || T <- Term], <<",">>), <<"]">>]
    end.

join(Items, Sep) -> join1(Items, Sep, []).
join1([], _, Acc) -> lists:reverse(Acc);
join1([H], Sep, Acc) -> join1([], Sep, [H|Acc]);
join1([H|T], Sep, Acc) -> join1(T, Sep, [Sep,H|Acc]).

请注意,此实现允许一些无效的JSON结构,例如不是字符串的键。