榆树:JSON解码器,将String转换为Bool

时间:2016-05-11 09:07:42

标签: elm

我收到的JSON看起来像这样:

{ name: "NAME1", value: "true" }

我想创建一个json解码器来创建这样的记录:

{ name: "NAME1", value: True }

我正在尝试制作一个将“true”转换为True的解码器。到目前为止我这样做了:

userProperties : Json.Decode.Decoder Props
userProperties =
  Json.Decode.object2 (,)
    ("name" := Json.Decode.string)
    ("value" := Json.Decode.string)
      `andThen` \val ->
        let
          newVal = -- Do something here?
        in
          Json.Decode.succeed <| newVal

1 个答案:

答案 0 :(得分:8)

您的示例中存在一些问题,让我们逐步介绍每个问题。

你没有显示Props的定义所以我假设,根据你的例子,它是这样的:

type alias Props = { name : String, value : Bool }

您将(,)作为object2的第一个参数传递,表示您将返回类型为元组的解码器。那应该是:

Json.Decode.object2 Props

现在,您使用andThen的方式由于其优先顺序而无法编译。如果你要将整个事情括起来,它将如下所示:

userProperties =
  (Json.Decode.object2 Props
    ("name" := Json.Decode.string)
    ("value" := Json.Decode.string))
      `andThen` \val ->
        let
          newVal = -- Do something here?
        in
          Json.Decode.succeed <| newVal

这不是正确的,因为您想要andThen的内容是"true"字段中的字符串"value"。为此,我建议创建一个提供该布尔解码器的解码器:

stringBoolDecoder : Json.Decode.Decoder Bool
stringBoolDecoder =
  string `andThen` \val ->
    case val of
      "true" -> succeed True
      "false" -> succeed False
      _ -> fail <| "Expecting \"true\" or \"false\" but found " ++ val

我只是在猜测"false"的处理和所有下划线。根据您的业务案例更改其实施。

在构建复杂的解码器时,通常最好将解码器定义分解为可能的最小块,如上所述。

最后,我们现在可以重新定义您的userProperties解码器,以便在适当的位置使用stringBoolDecoder

userProperties : Json.Decode.Decoder Props
userProperties =
  Json.Decode.object2 Props
    ("name" := Json.Decode.string)
    ("value" := stringBoolDecoder)