Elm:使用“type”属性为JSON键入别名

时间:2016-01-20 09:20:07

标签: elm

我有一些带有“type”属性的JSON,我想导入Elm。例如,{ "id": "abc", "type": "thing" }但是,如果我使用type作为属性定义类型别名,编译器会抱怨。如,

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

产生

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

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

真的?我必须重命名该属性?有没有办法引用或逃避它,所以它会编译?

4 个答案:

答案 0 :(得分:7)

是的,type是保留关键字,不能用作记录中的字段名称。

在Elm和Haskell中,在你的案例中最常见的做法似乎是附加单引号,因此它变为type',你的类型定义变为

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

这源于数学的prime symbol。它起初可能看起来很奇怪,但它是有效的语法。

然后,您可以使用以下Json解码器将JSON转换为Foo:

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

请注意,Elm中的确切字段名称不需要与JSON字段名称匹配。

您很少会找到一种语言,可让您将关键字用作未转义的变量名称。这种行为并非榆树独有。

答案 1 :(得分:2)

在oscpad中,我使用"类型"我的json界面中的字段在websockets上。但是我没有在榆树记录中有一个叫做类型的字段。我只是寻找"类型"我正在解析JSON时的字段。我的代码如下所示:

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)

答案 2 :(得分:1)

您现在可以在下划线后对该关键字进行转义。

例如。

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

答案 3 :(得分:-1)

没有逃脱。榆树毫不妥协。