2016-01-20 7 views
5

Ho alcuni JSON con una proprietà "type" che voglio importare in Elm. ad es., { "id": "abc", "type": "thing" } Tuttavia, se definisco un alias di tipo con type come proprietà, il compilatore si lamenta. per esempio,Elm: digita alias per JSON con la proprietà "type"

type alias Foo = { 
     id: String 
    , type: String 
} 

produce

It looks like the keyword `type` is being used as a variable. 

3│  , type: String 
      ^
Rename it to something else. 

serio? Devo rinominare la proprietà? Non c'è modo di citarlo o di evaderlo, quindi verrà compilato?

risposta

6

Sì, type è una parola chiave riservata e non può essere utilizzato come nome di campo in un record.

A Elm e Haskell, la cosa più comune da fare nel tuo caso sembra essere per aggiungere una sola offerta, in modo che diventi type', e la tua definizione di tipo diventa

type alias Foo = 
    { id: String 
    , type': String 
    } 

Questo ha la sua origine nel prime symbol dalla matematica. All'inizio può sembrare strano, ma è una sintassi valida.

è possibile utilizzare il seguente JSON Decoder per tradurre il JSON in Foo:

fooDecoder = 
    Json.object2 
    Foo 
    ("id" := Json.string) 
    ("type" := Json.string) 

Si noti che il nome del campo esatto a Elm non ha bisogno di corrispondere al nome del campo JSON.

Raramente troverai una lingua che ti consente di utilizzare parole chiave come nomi di variabili senza caratteri di escape. Questo comportamento non è unico per Elm.

+0

L'aggiunta di una virgoletta singola non sfugge al nome del campo, tuttavia lo cambia in un nome diverso. – noah

+0

Ho aggiornato la mia risposta per mostrare come il nome del campo in JSON non deve necessariamente corrispondere al campo Elm a cui viene decodificato. –

+0

Usare una virgoletta singola nel nome è veramente sbagliato in Elm 0.16 almeno. Diventa l'inizio di una stringa letterale nel JS generato. Usare _ invece funziona bene. –

-1

Non c'è via di fuga. Elm è intransigente.

+0

tipo di un comportamento duro. Cosa succede se qualcuno sta lavorando con un'API che non controlla? – marcosh

+0

@marcosh bene puoi tradurre la parola chiave in un altro campo/nome varable, e quel nome è usato solo all'interno di Elm. Se esporti a JS tramite una porta, dovrai ricollegarlo. Quindi il nome del campo non corrisponde esattamente al nome della proprietà JSON, ma non è una barriera per lavorare con qualsiasi tipo di JSON. Solo fastidioso IMO – noah

2

In oscpad, sto usando un campo "tipo" nella mia interfaccia JSON su websocket. Ma non ho un campo chiamato type in un record elm. Cerco solo un campo "tipo" quando sto analizzando JSON. Il mio codice assomiglia a questo:

jsSpec : JD.Decoder Spec 
jsSpec = 
    ("type" := JD.string) `JD.andThen` jsCs 

jsCs : String -> JD.Decoder Spec 
jsCs t = 
    case t of 
    "button" -> SvgButton.jsSpec `JD.andThen` (\a -> JD.succeed (CsButton a)) 
    "slider" -> SvgSlider.jsSpec `JD.andThen` (\a -> JD.succeed (CsSlider a)) 
    "label" -> SvgLabel.jsSpec `JD.andThen` (\a -> JD.succeed (CsLabel a)) 
    "sizer" -> jsSzSpec `JD.andThen` (\a -> JD.succeed (CsSizer a)) 
    _ -> JD.fail ("unkown type: " ++ t)