2016-06-09 3 views
2

나는 Elixir을 사용하여 외부 API에서 json을 검색하고이를 Postgresql 데이터베이스에 저장합니다. 독약을 사용하여 json을 Elixir Ecto (2.0) 스키마로 디코딩했습니다. 한 가지 측면을 제외하면 잘 작동합니다. json의 요소는 키가없는 List입니다. 이 요소를 Elixir 구조체에 매핑하는 방법에 대한 손실이 있습니다.Elixir JSON리스트를 구조체로 디코딩

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로 모델링 할 수있는지도로 바꿀 수 있습니까? 이런 문제가 발생한 사람이 있습니까?

모든 안내를 받으실 수 있습니다!

+1

'Person : 관심 분야, 관심 분야, {: 배열, 문자열}'을 원하십니까? – Dogbert

+0

와우, 그랬어! – Will

답변

2

고맙습니다. 도버트. Person Ecto.schema에 json의 "interest"요소에 대한 {: array, : string} 유형의 필드를 추가했습니다. 독을 사용하여 json에서 구조체를 성공적으로로드했습니다!

defmodule Person do 
    use Ecto.Schema 

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