On Friday, November 17, 2017 at 3:19:55 PM UTC, Thiago Temple wrote:
>
> I have situation where I have to a jso object similar to this
>
> { "level": 1, "displayValue": "some text", "dataValue": "a string with 
> the value" }
>
> { "level": 1, "displayValue": "some text", "dataValue": { "name": "xxx", 
> "scope": "xxxx" } }
>
> Both cases for dataValue are valid, it can either have a string or an 
> object.
>
> I have created types as such:
>
> type DataValue
>   = Val String
>   | Key KeyType
>
> type alias KeyType =
>  { name: String, source: String }
>
> type alias MyObj = 
>  { level: Int, displayValue: String, dataValue: DataValue}
>
> How can I decode dataValue for MyObj?
>
> Thanks 
>

I think the Decode.oneOf suggestion from Aaron VonderHaar is most likely to 
be useful to you.

Just to give another way, here is some decoder code for a JSON structure 
where I also added an explicit @type field to indicate which type it is to 
be decoded to. This is a little more complex, and in my case required the 
back-end to play nicely and insert the @type fields too. It does avoid the 
trial and error approach of 'oneOf' too:

{-| 
Describes the ContentModel view type. 
-} 
type ContentModel = 
    TitledAsContentModel Titled 
    | MdContentAsContentModel MdContent 
    | PanelAsContentModel Panel 
 
{-| 
A JSON encoder for the ContentModel type. 
-} 
contentModelEncoder : ContentModel -> Encode.Value 
contentModelEncoder model = 
  case model of 
    TitledAsContentModel titled -> titledEncoder titled 
    MdContentAsContentModel mdContent -> mdContentEncoder mdContent 
    PanelAsContentModel panel -> panelEncoder panel 
 
{-| 
A JSON decoder for the ContentModel type. 
-} 
contentModelDecoder : Decoder ContentModel 
contentModelDecoder = 
  let 
    toContentModel typeName = 
      case typeName of 
        "Titled" -> map TitledAsContentModel titledDecoder 
        "MdContent" -> map MdContentAsContentModel mdContentDecoder 
        "Panel" -> map PanelAsContentModel panelDecoder 
        _ -> Decode.fail ("unknown type: " ++ typeName) 
  in 
    field "@type" Decode.string 
      |> andThen toContentModel





-- 
You received this message because you are subscribed to the Google Groups "Elm 
Discuss" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to