看了这样的事情,但无法找到确切的问题。
我从服务器端验证返回JSON,如下所示:
{
"field": ["field-name"],
"messages":["message","message"]
}
我想要做的是将其解码为像
这样的榆树记录{ field: String, messages: List String }
但是,我在使用err,field字段时遇到了问题。我无法将单个元素JSON数组转换为该元素的字符串。
甚至可以使用Decode,或者我最好将其解码为List,然后从列表中抓取头部。
这就是我对解码的看法:
valErrorDecoder : Decode.Decoder ValError
valErrorDecoder =
decode ValError
|> required "field" (Decode.list Decode.string)
|> required "messages" (Decode.list Decode.string)
感谢您的帮助!
答案 0 :(得分:9)
尝试Decode.index
,这应该可以解决问题。
valErrorDecoder : Decode.Decoder ValError
valErrorDecoder =
decode ValError
|> required "field" (Decode.index 0 Decode.string)
|> required "messages" (Decode.list Decode.string)
答案 1 :(得分:4)
您在评论中提到一位同事建议Decode.map
。如果你有点好奇,这就是(更复杂的)解决方案的样子:
firstElementDecoder : Decode.Decoder a -> Decode.Decoder a
firstElementDecoder baseDecoder = Decode.list baseDecoder
|> Decode.map List.head
|> Decode.andThen (Maybe.map Decode.succeed >> Maybe.withDefault (Decode.fail "Empty list"))
这里发生了什么?我们首先解码一个字符串列表,然后将List.head
函数映射到该列表,给出Decoder (Maybe String)
。功能
Maybe.map Decode.succeed
>> Maybe.withDefault (Decode.fail "Empty list")
接收Maybe
并将其转换为解码器,该解码器要么成功(带有可能的值)要么失败(带有"空列表"错误消息)。我们使用此函数作为Decode.andThen
的参数,其中:
Maybe
传递到上面的函数中,获取Decode.succeed
或Decode.fail
所以,是的,Decode.index 0
更容易!但也可能有兴趣看到更长的解决方案: - )