json elm

Elm: Cómo decodificar datos de la API JSON



(1)

NB Json.Decode docs

Prueba esto:

import Json.Decode as Decode exposing (Decoder) import String -- <SNIP> stringToInt : Decoder String -> Decoder Int stringToInt d = Decode.customDecoder d String.toInt decoder : Decoder Model decoder = Decode.map5 Model (Decode.field "id" Decode.string |> stringToInt ) (Decode.at ["attributes", "invitation_id"] Decode.int) (Decode.at ["attributes", "name"] Decode.string) (Decode.at ["attributes", "provider"] Decode.string) (Decode.at ["attributes", "provider_user_id"] Decode.string |> stringToInt) decoderColl : Decoder Collection decoderColl = Decode.map identity (Decode.field "data" (Decode.list decoder))

La parte difícil es usar stringToInt para convertir los campos de cadena en números enteros. He seguido el ejemplo de API en términos de qué es un int y qué es una cadena. Tuvimos la suerte de que String.toInt devuelva un Result como lo espera customDecoder pero hay suficiente flexibilidad para que pueda ser un poco más sofisticado y aceptar ambos. Normalmente usarías el map para este tipo de cosas; customDecoder es esencialmente un map de funciones que pueden fallar.

El otro truco era usar Decode.at para ingresar al objeto secundario de attributes .

Tengo estos datos utilizando el formato http://jsonapi.org/ :

{ "data": [ { "type": "prospect", "id": "1", "attributes": { "provider_user_id": "1", "provider": "facebook", "name": "Julia", "invitation_id": 25 } }, { "type": "prospect", "id": "2", "attributes": { "provider_user_id": "2", "provider": "facebook", "name": "Sam", "invitation_id": 23 } } ] }

Tengo mis modelos como:

type alias Model = { id: Int, invitation: Int, name: String, provider: String, provider_user_id: Int } type alias Collection = List Model

Quiero decodificar el json en una colección, pero no sé cómo.

fetchAll: Effects Actions.Action fetchAll = Http.get decoder (Http.url prospectsUrl []) |> Task.toResult |> Task.map Actions.FetchSuccess |> Effects.task decoder: Json.Decode.Decoder Collection decoder = ?

¿Cómo implemento decodificador? Gracias