Вот parse transform, который превращает proplists в records и обратно.
https://github.com/5HT/n2o/blob/master/src/n2o_rest.erl
В контексте задачи применительно к JSON транформациям.
Вот пример использования:
https://github.com/synrc/n2o_sample/blob/master/src/users.erl
Вы просто пишете
-rest_record(user).
И для рекорда #user{} автоматически генерируют функции трансформации в proplists и обратно (from_json и to_json).
Если parse_transform по каким-то причинам не устраивает.
То вот в образовательных целях минимальный код (map и unmap):
hunmap([],O,_,_) -> O;
hunmap([{BK,V}|T],O,Keys,0) -> O;
hunmap([{BK,V}|T],O,Keys,L) ->
K = wf:to_atom(BK),
hunmap(T, setelement(
wf_utils:indexof(K,Keys),O,wf:to_list(V)), Keys--[K],L-1).
-define(unmap(Record), unmap(P,R) ->
hunmap(P,R,record_info(fields, Record),size(R)-1)).
-define(map(Record), map(O) ->
Y = [ try N=lists:nth(1,B), if is_number(N) ->
wf:to_binary(B); true -> B end catch _:_ -> B end
|| B <- tl(tuple_to_list(O)) ],
lists:zip(record_info(fields, Record), Y)).