Разбор JSON с Erlang (erlang-rfc4627 lib) - PullRequest
1 голос
/ 06 марта 2011

Я пытаюсь выполнить синтаксический анализ JSON с erlang-rfc4627 и борюсь с возвращенными результатами

Это JSON:

{
  "people": [
    {"name": "Toby"}
  ]
}

Использование erlang-rfc4627 библиотека:

{ok, Json, []} = rfc4627:decode("...")

Я могу прекрасно декодировать в Erlang как:

{obj,[
  {"people",[
    {obj,[
      {"name",<<"Toby">>}
    ]},
    {obj,[
      {"name",<<"Blah">>}
    ]}
  ]}
]}

Но что тогда происходит?Как я могу вывести множество людей из этой структуры простым способом?(Это очень упрощенная модель всего JSON).

Есть ли лучшая библиотека, которую я должен использовать для этого?

Обновлено Я заметил, что при извлечениимассивы, каждый элемент массива имеет структуру ужасный obj, которая делает процесс манипулирования массивами очень неуклюжим.

Почему на Земле это так сложно в Эрланге?

Ссылка: http://www.lshift.net/blog/2007/02/17/json-and-json-rpc-for-erlang

Ответы [ 2 ]

2 голосов
/ 06 марта 2011

Как насчет:

lookup(K, {obj, PL}) -> proplists:get_value(K, PL).

А затем

People = lookup("people", JSON),
Names  = [lookup("name", Obj) || Obj <- People].

Лучший способ обобщить эту идею в компилятор запросов, который может компилировать любой запрос в функцию, которая затем может быть примененав документ JSON.Будет намного проще, если вы захотите постоянно перелистывать документы JSON.

Также важно отметить, что вам, вероятно, не следует работать непосредственно со структурой JSON, а встраивать ее во что-то другое внутримир Эрланга.

0 голосов
/ 29 июня 2018

Есть ли лучшая библиотека, которую я должен использовать для этого?

Пожалуйста, попробуйте использовать библиотеку наподобие jiffy , потому что эту библиотеку легко использовать:1007 *

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]
...