[erlang-questions] Access JSON in Erlang like you do in JavaScript
Richard O'Keefe
ok@REDACTED
Wed Oct 20 07:22:40 CEST 2010
On 20/10/2010, at 10:57 AM, Ryan Zezeski wrote:
> I feel like a lot of people tend to feel pain when working with JSON in
> Erlang. Especially when trying to access nested values. I wrote a blog
> post about a way you can access JSON in Erlang using the same syntax you
> would in JavaScript.
>
> http://www.progski.net/blog/2010/destructuring_json_in_erlang_made_easy.html
In Javascript you would access a single item using something like
thingy[i1][i2][i3]
where i1, i2, i3 are non-negative integer array indices or
string hash keys. Suppose you have an implementation of EEP 18
(http://www.erlang.org/eeps/eep-0018.html). Then
at(JSON = [H|_], Index) when is_tuple(H) ->
if is_atom(Index) ; is_binary(Index) ->
{value,{Index,Item}} = lists:keysearch(Index, 1, JSON),
Item
end;
at(JSON, Index) when is_list(JSON), is_integer(Index) ->
lists:nth(Index + 1, JSON).
at(JSON, I1, I2) -> at(at(JSON, I1), I2).
at(JSON, I1, I2, I3) -> at(at(JSON, I1), I2, I3).
at(JSON, I1, I2, I3, I4) -> at(at(JSON, I1), I2, I3, I4).
at_path(JSON, []) -> JSON;
at_path(JSON, [X|Xs]) -> at_path(at(JSON, X), Xs).
and now thingy[i1][i2][i3] becomes
at(Thingy, I1, I2, I3)
or at_path(Thingy, [I1,I2,I3]).
One example in the link would be
at(Obj, <<"post">>, <<"title">>)
Another would be just
at(Obj2, <<"person">>, <<"friends">>, 1)
Adjusting this to the data structure used by mochijson2 would be simple too.
It hardly seems worth adding special syntax and transformations to Erlang
for something this simple.
So what am I missing?
More information about the erlang-questions
mailing list