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

Elm: JSON decoder, convert String to Bool

我收到的 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

您的示例中存在一些问题,所以让我们逐步解决每个问题。

您没有显示 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 的是 "value" 字段中的字符串 "true"。为此,我建议创建一个提供布尔解码器的解码器:

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)