gpt4 book ai didi

json - 将 epgsql 结果转换为 JSON

转载 作者:行者123 更新时间:2023-11-29 13:28:10 25 4
gpt4 key购买 nike

我是 Erlang 和函数式编程的初学者。为了好玩,为了让我开始,我正在转换一个现有的 Ruby Sinatra REST(ish) API,它查询 PostgreSQL 并返回 JSON。

在 Erlang 方面,我使用 Cowboy、Epgsql 和 Jiffy 作为 JSON 库。

Epgsql 以下列格式返回结果:

{ok, [{column,<<"column_name">>,int4,4,-1,0}], [{<<"value">>}]}

但 Jiffy 在编码为 JSON 时期望以下格式:

{[{<<"column_name">>,<<"value">>}]}

以下代码用于将 epgsql 输出转换为适合 jiffy 的输入:

假设 Data 是 Epgsql 输出,Key 是正在创建的 JSON 对象的名称:

{_, C, R} = Data,
Columns = [X || {_, X, _, _, _, _} <- C,
Rows = tuple_to_list(hd(R)),
Result = {[{atom_to_binary(Key, utf8), {lists:zip(Columns, Rows)}}]}.

但是,我想知道这是否是高效的 Erlang?

我查看了 Epgsql 和 Jiffy 的文档,看不到任何更明显的执行转换的方法。

谢谢。

最佳答案

是的,需要解析它。

例如函数解析结果

parse_result({error, #error{ code = <<"23505">>, extra = Extra }}) ->
{match, [Column]} =
re:run(proplists:get_value(detail, Extra),
"Key \\(([^\\)]+)\\)", [{capture, all_but_first, binary}]),
throw({error, {non_unique, Column}});
parse_result({error, #error{ message = Msg }}) ->
throw({error, Msg});
parse_result({ok, Cols, Rows}) ->
to_map(Cols, Rows);
parse_result({ok, Counts, Cols, Rows}) ->
{ok, Counts, to_map(Cols, Rows)};
parse_result(Result) ->
Result.

然后函数将结果转换为 map

to_map(Cols, Rows) ->
[ maps:from_list(lists:zipwith(fun(#column{name = N}, V) -> {N, V} end,
Cols, tuple_to_list(Row))) || Row <- Rows ].

并将其编码为json。您可以更改我的代码并将输出作为 proplist。

关于json - 将 epgsql 结果转换为 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29781505/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com