Elm:将具有单个元素的 JSON 数组解码为字符串

Elm: Decode a JSON array with a single element into a string

找过类似的东西,但找不到确切的问题。

我有一个 JSON 从服务器端验证返回,看起来像:

{ 
  "field": ["field-name"], 
  "messages":["message","message"]
}

我想做的是将它解码成像

这样的榆树记录
{ field: String, messages: List String }

但是,我在使用 err, field 字段时遇到了问题。我无法将单个元素 JSON 数组转换为该元素的字符串。

解码是否可行,或者我最好将其解码为列表,然后从列表中抓取头部。

这是我要解码的内容:

valErrorDecoder : Decode.Decoder ValError
valErrorDecoder =
decode ValError
    |> required "field" (Decode.list Decode.string)
    |> required "messages" (Decode.list Decode.string)

感谢您的帮助!

尝试 Decode.index,应该可以。

valErrorDecoder : Decode.Decoder ValError
valErrorDecoder =
decode ValError
    |> required "field" (Decode.index 0 Decode.string)
    |> required "messages" (Decode.list Decode.string)

您在评论中提到一位同事建议 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 并将其转换为解码器,解码器要么成功(带有 maybe 的值),要么失败(带有 "Empty list" 错误消息)。我们使用这个函数作为Decode.andThen的参数,其中:

  1. 将列表解码器中的 Maybe 传递给上面的函数,得到 Decode.succeedDecode.fail
  2. 运行返回的解码器,使用适当的值成功或失败。

所以,是的,Decode.index 0 更简单!但也可能有兴趣查看更长的解决方案:-)