You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何高效将Erlang的gb_trees转换为JSON或map?

在Erlang中高效转换gb_trees为JSON或Map的方法

转成Map的最简高效方式

Erlang标准库自带完整的工具链,先通过gb_trees:to_list/1将树结构转为键值对列表,再用maps:from_list/1生成Map。这两个都是标准库实现的原生操作,时间复杂度均为O(n),性能有保障:

% 假设Tree是你的gb_tree实例
KVList = gb_trees:to_list(Tree),
TargetMap = maps:from_list(KVList).

转成JSON的两种思路

1. 先转Map再序列化

如果使用的JSON库(比如jsx、jiffy)支持直接序列化Map,可以在转Map的基础上直接调用序列化函数:

% 以jsx为例
JsonBin = jsx:encode(maps:from_list(gb_trees:to_list(Tree))).

2. 直接序列化键值对列表

多数JSON库支持直接将键值对列表序列化为JSON对象,这样可以省去转Map的步骤,效率略高:

JsonBin = jsx:encode(gb_trees:to_list(Tree)).

处理Erlang特有类型

如果你的gb_trees中包含tuple这类JSON不原生支持的类型(比如示例中的{25,56}),需要先做类型转换,比如把tuple转为列表或字符串,示例如下:

% 自定义处理函数,将树中的tuple键和自定义结构转为JSON兼容类型
process_kv({K, {fld, FldKey, Val}}) ->
    {tuple_to_list(K), #{<<"field_key">> => tuple_to_list(FldKey), <<"value">> => Val}};
process_kv({K, V}) ->
    {tuple_to_list(K), V}.

% 处理后再序列化
ProcessedKV = lists:map(fun process_kv/1, gb_trees:to_list(Tree)),
JsonBin = jsx:encode(ProcessedKV).

内容的提问来源于stack exchange,提问作者heiheshang

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 07:22:06