如何在Json.Decoder中从String转换为Int

时间:2015-09-07 18:06:40

标签: json elm

这是我的解码器:

decodeData : Json.Decoder (Id, String)
decodeData =
  Json.at ["data", "0"]
    <| Json.object2 (,)
      ("id" := Json.int)
      ("label" := Json.string)

id逻辑上应为Int,但我的后端会将其作为String发送(例如,我们会"1"而不是1)。

如何将解码后的值转换为Int

3 个答案:

答案 0 :(得分:6)

...并回答自己:)我在这个Flickr示例中找到了解决方案

decodeData : Json.Decoder (Id, String)
decodeData =
  let number =
    Json.oneOf [ Json.int, Json.customDecoder Json.string String.toInt ]
  in
    Json.at ["data", "0"]
      <| Json.object2 (,)
        ("id" := number)
        ("label" := Json.string)

答案 1 :(得分:0)

在Elm-0.18

使用parseInt解码器(source):

decodeString parseInt """ "123" """

以下是关于自定义解码器的tutorial,例如日期。重用fromResult方法。

答案 2 :(得分:0)

已验证的答案已过时。这是榆木0.19的答案:

dataDecoder : Decoder Data
dataDecoder =
    Decode.map2 Data
        (Decode.field "id" (Decode.string |> Decode.andThen stringToIntDecoder))
        (Decode.field "label" Decode.string)


stringToIntDecoder : String -> Decoder Int
stringToIntDecoder year =
    case String.toInt year of
        Just value ->
            Decode.succeed value

        Nothing ->
            Decode.fail "Invalid integer"

还有一个executable example