Poison 似乎自动将 JSON 对象数组转换为地图。我能做些什么来防止这种情况发生?
Poison seems to automatically convert a JSON array of objects to a map. What can I do to prevent that?
在我的应用程序中,我在 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 列表,它保留了它的顺序并且正是我想要的。
为什么会这样?我能做些什么来保留该数组中对象的原始顺序吗?
原来我一开始就没有正确发送数据。 Content-Type 默认指定为 application/x-www-form-urlencoded
。它应该改为 application/json
而数据应该是 JSON.stringify(data)
。参见 jQuery ajax, how to send JSON instead of QueryString。
在我的应用程序中,我在 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 列表,它保留了它的顺序并且正是我想要的。
为什么会这样?我能做些什么来保留该数组中对象的原始顺序吗?
原来我一开始就没有正确发送数据。 Content-Type 默认指定为 application/x-www-form-urlencoded
。它应该改为 application/json
而数据应该是 JSON.stringify(data)
。参见 jQuery ajax, how to send JSON instead of QueryString。