Эликсир декодирует список JSON в структуру

Я использую Elixir для получения json из внешнего API и сохранения его в базе данных Postgresql. Я использую Poison для декодирования json в схемы Elixir Ecto (2.0). Он работает хорошо, за исключением одного аспекта: элемент json - это список без каких-либо ключей. Я не понимаю, как сопоставить этот элемент со структурой 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? Кто-нибудь сталкивался с подобной проблемой раньше?

Любое руководство будет оценено!


person Will    schedule 09.06.2016    source источник
comment
Я думаю, вы хотите field :interests, {:array, :string} в Person?   -  person Dogbert    schedule 09.06.2016


Ответы (1)


Спасибо, Догберт. Я добавил поле типа {: array,: string} для элемента "интересов" json в Person Ecto.schema. Я успешно загрузил структуру из json с помощью Poison!

defmodule Person do
  use Ecto.Schema

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