2017-09-26 7 views
0

を考えると、次の種類:デコードネストされたJSON値(0.18)

type alias Wrapper = 
    { data : Data } 

type alias Data = 
    { name : String } 

そして、次のJSON:

{"data": {"name": "Keith"}} 

私は私がHTTPを有効にすることを可能にするデコーダを書くことができますどのようにWrapperエイリアスのインスタンスへの応答?

私は、実行可能なソリューションを見つけることなく、コアライブラリJson.Decode.PipelineとJson.Decode.Extraを使用していくつかのアプローチを試みました。これは、エンドユーザーの問題点巻き上げ

になり
dataDecoder = 
    succeed Data 
     |> andMap (field "name" Decode.string) 

wrapperDecoder = 
    succeed Wrapper 
     |> andMap (field "data" dataDecoder) 

BadPayload "Expecting an object with a field named name but instead got: {\"data\":{\"name\":\"foo\"}}" { status = { code = 200, message = "OK" }, headers = Dict.fromList [("cache-control","max-age=0, private, must-revalidate"),("content-type","application/json; charset=utf-8")], url = " http://localhost:5000//users/foo ", body = "{\"data\":{\"name\":\"foo\"}}" }

EDITここ

は私の最新の試みです。 I で正しいデコーダをHttp.postに渡しましたが、Http.sendは実際にはHttp.postをラップする関数を呼び出していませんでした。 Doh。

+1

あなたがそれを理解してくれてうれしい! –

答えて

1

あなたのデコーダはあなたの例の入力に対して正常に動作しますが、あなたが取得しているエラーメッセージは、エラーメッセージがnameというフィールドを探しているので、あなたは、あなたのHTTP呼び出しではなく、wrapperDecoderdataDecoderを使用しようとしていると信じて私をリード。

succeedandMapあなたのデコーダを構築するために使用することができますが、あなたはmapとによって得ることができます。

dataDecoder : Decoder Data 
dataDecoder = 
    Decode.map Data (field "name" string) 

wrapperDecoder : Decoder Wrapper 
wrapperDecoder = 
    Decode.map Wrapper (field "data" dataDecoder) 
+0

答えとバニラソリューションをありがとう。残念ながら、 'wrapperDecoder'を' Http.post'に渡しています。例えば'Http.post apiUrl body wrapperDecoder'。 – pdoherty926

1

チャド・ギルバートが書いたように、あなたのデコーダが細かいです:https://ellie-app.com/kDX99XRbta1/0

へdoublecheck、タイプ注釈をデコーダに追加:

dataDecoder : Decoder Data 
dataDecoder = ... 

wrapperDecoder : Decoder Wrapper 
wrapperDecoder = ... 

あなたが本当にwrapperDecoderHttp.post apiUrl body wrapperDecoder)を使用している場合は、エラーのためのもう一つの可能​​性があります:

{"data": {"data": {"name": "foo"}}} 

あなたがこれをdoublecheckことができます:あなたのAPIエンドポイントは、異なる形状のようなものがデータを返すことは? (Chromeのウェブインスペクタなど)

+0

答えと作業サンプルありがとう!私は 'wrapperDecoder'を' Http.post'に渡していることを確認できます。そして、私のAPIが期待した形状のデータを返しています。 'curl -X POST http:// localhost:5000/users/foo => {"データ ":{"名前 ":" foo "}}'私は自分のコードを整理して疑問を除外するためにそれを私の質問に追加しようとします。 – pdoherty926

関連する問題