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