尝试使用
File.read()
读取文件,然后将其通过管道传输到 Poison.decode!()
,但当我尝试运行它时,我不断收到此错误。
1st argument: not an iodata term
:erlang.iolist_to_binary(:enoent)
(poison 5.0.0) lib/poison/parser.ex:103: Poison.Parser.parse!/2
解析json文件的函数
defmodule PROCESS_JSON do
@json_path "./data.json"
def parse_json() do
@json_path
|> File.read()
// |> elem(1) Tried with and without this but get same error.
|> Poison.decode!()
end
end
编辑更新:
好吧,我尝试添加
Path.relative
但现在我收到此错误
* 1st argument: not an iodata term
:erlang.iolist_to_binary(:enoent)
(poison 5.0.0) lib/poison/parser.ex:103: Poison.Parser.parse!/2
...
def parse_json() do
@json_path
|> Path.relative
|> File.read()
|> elem(1)
|> Poison.decode!()
end
// JSON file
{
"a": 3,
"b": 2,
"c": 1,
...
}
更新2:
终于能够从JSON文件中获取数据,但是根据答案的建议,我切换到
Jason
模块进行解析,但它似乎不起作用。我只是想对上面发布的 JSON 文件进行排序,但出现此错误,表明 JSON 未解析。 (双引号仍在键周围)
protocol Enumerable not implemented for "%{\"a\" => 3, \"b\" => 2, ...
of type BitString. This protocol is implemented for the following type(s):
Date.Range, File.Stream, Function, GenEvent.Stream, HashDict, HashSet,
IO.Stream, Jason.OrderedObject, List, Map, MapSet, Range, Stream
|> File.read!(json_file)
|> Jason.decode()
|> elem(1)
|> Enum.sort(:asc)
根据编辑进行更新。
我无法重现你的问题:
iex(1)> File.write!("test.json", ~S({"a": 3, "b": 2, "c": 1}))
:ok
iex(2)> File.read!("test.json") |> Jason.decode!() |> Enum.sort()
[{"a", 3}, {"b", 2}, {"c", 1}]
File.read!
(与 !
)代替,因为这样可以代替:
{:error, :enoent}
你会得到这个:
** (File.Error) could not read file "./data.json": no such file or directory
这更清楚了。
正如丹尼尔在评论中所说,问题是该文件不存在。
仅供参考 Jason 是新项目 JSON 解析的流行选择。