Elixir将JSON列表解码为Struct

时间:2016-06-09 03:27:28

标签: json struct elixir ecto elixir-poison

我正在使用Elixir从外部API检索json并将其存储在Postgresql数据库中。我正在使用Poison将json解码为Elixir Ecto(2.0)模式。除了一个方面,它运行良好:json的一个元素是一个没有任何键的List。我不知道如何将这个元素映射到Elixir结构。

json:

{"name": "Joe Random"
 "address": {
   "street": "123 Main St",
   "city": "Smalltown"
   },
 "interests": [
   "Biking",
   "Movies"
   ]
}

这个json采用结构(人)的形式,具有嵌入式结构(地址)和嵌入式列表(兴趣)。我想用Ecto.Schemas建模这个结构,所以我可以加载json。人和地址结构很简单:

defmodule Person do
  use Ecto.Schema

  schema "person" do
    field :name, :string
    embeds_one :address, Address
  end
end

defmodule Address do
  use Ecto.Schema

  embedded_schema do
    field :street, :string
    field :city, :string
  end
end

我可以使用Poison.decode加载这些结构:

Poison.decode!(json, as person: %Person{address: %Address{}})

但是,如何从json建模和存储"兴趣":?它只是一个没有任何键的简单单值列表。我可以把它变成一张我可以用Ecto.Schema建模的地图吗?有没有人遇到过这样的问题?

任何指导都将不胜感激!

1 个答案:

答案 0 :(得分:2)

谢谢你,Dogbert。我为"兴趣"添加了{:array,:string}类型的字段。 json到Person Ecto.schema的元素。我使用Poison从json成功加载了结构!

defmodule Person do
  use Ecto.Schema

  schema "person" do
    fields :name, :string
    embeds_one :address, Address
    fields :interests, {:array, :string}
  end
end