榆树JSON解码器对象数组

时间:2016-12-30 22:38:10

标签: elm

我正在使用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

我似乎无法使解码器正确,并且可以提供任何可以提供的帮助。

1 个答案:

答案 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