【问题标题】:Encode a tuple of strings with poison用毒药编码一个字符串元组
【发布时间】:2017-10-27 00:30:17
【问题描述】:

我正在尝试用毒药对这个字符串元组进行编码:

{"product existed but could not add categories to product",
 "Shop existed but could not add product to shop"}

收到此错误:

19:10:21.593 [error] #PID<0.339.0> running Api.Router terminated
Server: 192.168.20.3:4000 (http)
Request: POST /products
** (exit) an exception was raised:
    ** (Poison.EncodeError) unable to encode value: {"product existed but could not add categories to product", "Shop ex
isted but could not add product to shop"}
        (poison) lib/poison/encoder.ex:383: Poison.Encoder.Any.encode/2
        (poison) lib/poison/encoder.ex:227: anonymous fn/4 in Poison.Encoder.Map.encode/3
        (poison) lib/poison/encoder.ex:228: Poison.Encoder.Map."-encode/3-lists^foldl/2-0-"/3
        (poison) lib/poison/encoder.ex:228: Poison.Encoder.Map.encode/3
        (poison) lib/poison.ex:41: Poison.encode!/2
        (api) lib/api/router.ex:90: anonymous fn/1 in Api.Router.do_match/4
        (api) lib/api/router.ex:1: Api.Router.plug_builder_call/2
        (api) lib/plug/debugger.ex:123: Api.Router.call/2

Poison 可以对字符串元组进行编码,还是应该将 errors 的类型更改为其他类型?

【问题讨论】:

  • Poison 无法编码元组。您需要更改为列表或地图或 Poison 支持的任何其他类型。
  • 您可以为元组实现编码器,但生成的 JSON 应该是什么?数组?一个东西?一个字符串? JSON 中的元组没有自然表示,这就是为什么毒药默认不对其进行编码的原因。
  • 首先将消息列表存储为元组的原因是什么?
  • @michalmuskala 它可以很容易地成为一个列表。我将更改列表

标签: elixir elixir-poison


【解决方案1】:

如果您确实需要将元组编码为列表类型,则可以这样做:

defmodule TupleEncoder do
  alias Poison.Encoder

  defimpl Encoder, for: Tuple do
    def encode(data, options) when is_tuple(data) do
      data
      |> Tuple.to_list()
      |> Encoder.List.encode(options)
    end
  end
end

您应该能够根据需要使用类似的模式将其转换为另一种原始结构。

【讨论】:

    猜你喜欢
    • 2017-09-19
    • 1970-01-01
    • 2017-08-07
    • 1970-01-01
    • 2011-09-18
    • 1970-01-01
    • 2013-10-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多