我正在尝试使用erlang-rfc4627解析一些JSON并且难以使用返回的结果
这是JSON:
{
"people": [
{"name": "Toby"}
]
}
使用erlang-rfc4627库:
{ok, Json, []} = rfc4627:decode("...")
我可以解码为Erlang:
{obj,[
{"people",[
{obj,[
{"name",<<"Toby">>}
]},
{obj,[
{"name",<<"Blah">>}
]}
]}
]}
但接下来会发生什么? 如何以简单的方式从这个结构中获得一系列人? (这是整体JSON的一个非常简化的模型)。
我应该使用更好的库吗?
更新 我注意到在拉出数组时,数组的每个元素都包含了糟糕的 obj结构,这使得操作数组的过程非常笨拙。
为什么Erlang这么复杂?
参考:http://www.lshift.net/blog/2007/02/17/json-and-json-rpc-for-erlang
答案 0 :(得分:2)
怎么样:
lookup(K, {obj, PL}) -> proplists:get_value(K, PL).
然后
People = lookup("people", JSON),
Names = [lookup("name", Obj) || Obj <- People].
更好的方法将这个想法概括为一个查询编译器,它可以将任何查询编译成一个函数,然后可以将其应用于JSON文档。如果您希望始终在JSON文档内部进行破坏,那将会更容易。
同样重要的是要注意,您可能不应该直接在JSON结构上操作,而是将其嵌入到Erlang世界中的其他内容中。
答案 1 :(得分:0)
我应该为此使用更好的库吗?
请尝试使用jiffy之类的库,因为该库易于使用:
1> Doc = {[{foo, [<<"bing">>, 2.3, true]}]}.
{[{foo,[<<"bing">>,2.3,true]}]}
2> BinJSON = jiffy:encode(Doc).
<<"{\"foo\":[\"bing\",2.3,true]}">>
3> JsonMap = jiffy:decode(BinJSON, [return_maps]).
#{<<"foo">> => [<<"bing">>,2.3,true]}
4> maps:get(<<"foo">>, JsonMap, undefined).
[<<"bing">>,2.3,true]