【问题标题】:Poison seems to automatically convert a JSON array of objects to a map. What can I do to prevent that?Poison 似乎会自动将 JSON 对象数组转换为地图。我能做些什么来防止这种情况发生?
【发布时间】:2018-04-02 19:09:03
【问题描述】:

在我的应用中,我在 API 端点之一接受 JSON 对象:

pipeline :api do
  plug :accepts, ["json"]
end

在这个 JSON 对象中,有一个对象数组,例如结构可能是这样的:

{
  "a": "...",
  "b": [{"c": "...", "d": "..."}, {"c": "...", "d": "..."}]
}

在我的控制器中,当我尝试使用params["b"] 访问对象数组时,我惊讶地发现我得到了一个映射,索引是数组的原始索引,但是是字符串形式!

这意味着我几乎不可能恢复 b 的原始顺序,因为不能保证在 Elixir 中保留地图遍历的顺序。

我唯一能做的似乎是将 string 索引转换回其原始整数形式,然后将映射转换为列表,然后再对列表进行排序,这是很多无缘无故的麻烦。

但是,当我有一个简单的 JSON 数组时,例如

{
  "a": "...",
  "b": ["itemA", "itemB"]
}

然后我的控制器中的params["b"] 确实给了我一个 Elixir 列表,它的顺序保留了,这正是我想要的。

为什么会这样?我可以做些什么来保留该数组中对象的原始顺序吗?

【问题讨论】:

  • 我无法重现此内容。您发布的 JSON 已成功解码为数组。请发布您遇到问题的真实数据。
  • @mudasobwa 感谢您的评论。我进一步调查,结果发现我一开始没有正确发送数据。默认情况下,Content-Type 被指定为application/x-www-form-urlencoded。应改为application/json,数据应改为JSON.stringify(data)

标签: json elixir phoenix-framework elixir-poison


【解决方案1】:

原来我一开始就没有正确发送数据。默认情况下,Content-Type 被指定为application/x-www-form-urlencoded。应改为application/json,数据应改为JSON.stringify(data)。见jQuery ajax, how to send JSON instead of QueryString

【讨论】:

    猜你喜欢
    • 2011-05-21
    • 2010-09-22
    • 1970-01-01
    • 1970-01-01
    • 2021-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多