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