【问题标题】:Parsing JSON arrays of integers in Elixir在 Elixir 中解析 JSON 整数数组
【发布时间】:2016-03-02 20:38:26
【问题描述】:

如果我有一个 JSON 对象,其中键的值是一个整数数组,并且数组的 每个整数恰好与对应的代码点printable ASCII character,有什么方法可以让 Elixir 将数组解释为简单的整数列表而不是字符列表?

我使用了三种不同的 Elixir JSON 解析器来尝试获取返回的整数列表,但它们都返回列表的 char 表示形式:

elixir-json:

iex> JSON.decode!(~s({ "foo": [35, 35] }))
%{"foo" => '##'}

exjsx:

iex> JSX.decode!(~s({ "foo": [35, 35] }))
%{"foo" => '##'}

poison:

iex> Poison.decode!(~s({ "foo": [35, 35] }))
%{"foo" => '##'}

我想要的只是%{"foo" => [35, 35]}。这是可能的,还是我错过了什么?如果不可能,我应该如何将此值从 JSON 解码为 Elixir,然后如果需要将 JSON 发送到其他外部系统,我将如何将其编码回 JSON 数组?

编辑

感谢michalmuskalaanswer,我认为有些东西点击了,然后通过进一步调查,我意识到在解析 JSON 整数数组进出 Elixir 时确实没有什么可担心的:

iex> json = Poison.decode!(~s({ "foo": [35, 35] }))
%{"foo" => '##'}
iex> Poison.encode!(json)
"{\"foo\":[35,35]}"

【问题讨论】:

    标签: json elixir


    【解决方案1】:

    这是一个列表:

    iex(16)> '##' |> is_list
    true
    

    你可以对其进行常规的 List 操作:

    iex(15)> '##' |> List.first
    35
    

    【讨论】:

      【解决方案2】:

      返回的结果完全正确。 '##'[35, 35] 在 Elixir 中完全一样。这只是表示相同值的不同方式。

      iex> [35, 35] == '##'
      true
      iex> inspect [35, 35]
      "'##'"
      iex> inspect [35, 35], char_lists: :as_lists
      "[35, 35]"
      

      起初这令人困惑,但背后有一个强有力的理由。大多数 Erlang 库使用字符列表(或字符列表)作为字符串,而不是二进制文件作为 Elixir。为了便于互操作,如果列表仅包含可打印字符,则默认情况下将打印为单引号字符串。但这并不会改变它背后的数据——它只是相同值的不同表示。

      【讨论】:

      • 我觉得你回答的最后一句话让我终于明白了,所以非常感谢!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-05-25
      • 2021-12-29
      • 1970-01-01
      • 1970-01-01
      • 2017-05-15
      • 2017-01-23
      • 2012-04-21
      相关资源
      最近更新 更多