我正在使用elm进行http请求,我的响应是一个对象数组。每个对象如下
obj = {
title: "Some Title",
words: [ "word1", "word2", "word3", "word4" ]
}
到目前为止,这是我的解码器:
type alias ThisRes = List ResObj
type alias ResObj =
title: String
words: List String
decoded : Decoder ThisRes
decoded =
decode ThisRes
我似乎无法使解码器正确,并且可以提供任何可以提供的帮助。
答案 0 :(得分:3)
obj =
"""
{
"title": "Some Title",
"words": [ "word1", "word2", "word3", "word4" ]
}
"""
type alias ResObj =
{ title : String, words : List String }
objDecoder =
map2 ResObj
(at [ "title" ] string)
(at [ "words" ] (list string))
headingFrom : Result String ResObj -> String
headingFrom result =
case result of
Ok resobj ->
resobj.title
Err reason ->
toString reason
main =
h1 [] [ text <| headingFrom <| decodeString objDecoder obj ]
打破这个局面:
obj
只是一个表示一些JSON的字符串,用于说明示例。ResObj
类型别名,并为其获取类型构造函数。现在,您可以通过调用ResObj
来创建ResObj "MyTitle" ["word1", "wordb", "wordFightingMongooses"]
值。objDecoder
是一个有助于将JSON解码为ResObj
的值。它调用map2
,它接受一个类型构造函数,然后调用两个解码的JSON字段。 (at ["title"] string)
表示&#34;将JSON中title
处的值转换为字符串&#34;你可以猜到下一行的作用。因此,最终评估ResObj "SomeTitle" ["word1", "word2", "word3", "word4"]
并创造您的价值。main
中,我们有decodeString objDecoder obj
这个词。 decodeString
获取解码器值和JSON字符串,并查看它是否可以解码它。但它并没有返回ResObj
本身 - 因为解码可能会失败,它会返回一个结果。headingFrom
处理该结果。如果解码成功,我们的结果将是Ok resobj
,我们最终可以使用resobj。如果失败,它将成为Err reason
。