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

时间:2018-01-23 11:22:06

标签: json frontend elm decoder

看了这样的事情,但无法找到确切的问题。

我从服务器端验证返回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)

感谢您的帮助!

2 个答案:

答案 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的参数,其中:

  1. 将列表解码器中的Maybe传递到上面的函数中,获取Decode.succeedDecode.fail
  2. 运行返回的解码器,使用适当的值成功或失败。
  3. 所以,是的,Decode.index 0更容易!但也可能有兴趣看到更长的解决方案: - )