尝试解析 JSON,收到错误协议 Enumerable 未实现

问题描述 投票:0回答:1

尝试使用

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)
json elixir
1个回答
0
投票

根据编辑进行更新。

我无法重现你的问题:

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 解析的流行选择。

© www.soinside.com 2019 - 2024. All rights reserved.