使用Erlang解析JSON(erlang-rfc4627 lib)

时间:2011-03-06 12:47:48

标签: json parsing erlang

我正在尝试使用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

2 个答案:

答案 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]