2017-05-11 10 views
0

私はエリクサーには新しく、すみません、これは簡単だと確信しています。エリクシールポイズンデータ型を解析するJsonデータ

私は、このパターンを次のデータ型については何も見つけることができますことは、

%{"quoted_string" => "string_w_quotes"}

は何と呼ばれていますか?

ここに私が抱えている問題があります。私はHTTPoisonとPoisonを使用しています。私はGetリクエストを呼び出してJSONレスポンスを取得し、そのレスポンス全体をPoisonに渡します。それから、私はどんな薬が私に与えるのかをパターンマッチさせます。私はbody.addressと言うことができるポイントに到達しようとしていますが、エラーが発生します。

ここに関連するコードです:

# after call 
... 
body 
|> Poison.decode! 
|> case do 
    {:ok, %HTTPoison.Response{body: body}} -> 
    IO.puts "response received" 
    body.address 
... 

そして、それはこれを出力します。

応答が **(KeyError例外)キーを受け取った...:で見つかっていないアドレス:%{ "アドレス" => "123"、 "公共" => "ABC"} ...

だから私は、私の本当の問題は、私は

0123回すんかだと思います

% { "アドレス" => "123"、 "パブリック" => "ABC"}

% {へ:アドレス=> "123"、:公共= > "ABC"}

私は正常にこれを使用することができるように:

body.address 

はそのRIGHですt?

|> Poison.decode!(keys: :atoms!) 

私は原子としてキーをしたい毒に次のように語った。

+1

文字列をインターネットから原子に変換するのは悪い考えです。原子はガベージコレクションされません。したがって、以下で発見した 'body [" address "]'アプローチを使用してください。しかし、あなたの質問 'Enum.map(params、fn {key、value} - > {String.to_atom(key)、value} end)|> Enum.into(%{})'に答えてください。しかし、しないでください:) –

答えて

2

バイナリキーによるマップです。

body.addressは、マップ内のアトムキーにアクセスするための略です。ただし、キーが存在しない場合は機能しません。 body[:address]を使用する方がよいでしょう。マップにキーがない場合はnilを返します。

バイナリキーの場合は、body["address"]を使用して構造体にアクセスできます。代わりに、Map.get(body, "address")を使用することができます。

+1

この情報をありがとう、それは私も関連する問題を解決するのに役立ちました!私は '(keys :: atomic!)'を削除し、代わりに 'body [" address "]'を使って呼び出すことができました。 –

0

はこれを言うためにコードを変更しました。

+1

私はパターンを説明し、なぜそれが失敗していたので、私はそこに私の答えを残します。キーが存在しない場合に例外を発生させたくない場合は、マップにアクセスするために '.'表記を使用することはお勧めしません。 –