与递归相关的异常:无法获取属性'标记'未定义或空引用

时间:2017-10-19 00:15:09

标签: elm

执行HTTP帖子后收到以下错误:

  

无法获得财产标记'未定义或空引用

我认为执行以下解码器功能时会发生错误:

sourceDecoder : Decoder JsonSource
sourceDecoder =
    Decode.map5 JsonSource
        ...
        (field "Links" providerLinksDecoder)

解码器依赖项:

providerLinksDecoder : Decoder JsonProviderLinks
providerLinksDecoder =
    Decode.map JsonLinkFields
        (field "Links" <| Decode.list (Decode.lazy (\_ -> linkDecoder)))
        |> Decode.map JsonProviderLinks

linkDecoder : Decoder JsonLink
linkDecoder =
    Decode.map6 JsonLink
        (field "Profile" profileDecoder)
        ...

profileDecoder : Decoder JsonProfile
profileDecoder =
    Decode.map7 JsonProfile
        ...
        (field "Sources" <| Decode.list (Decode.lazy (\_ -> sourceDecoder)))

附录

type JsonProviderLinks
    = JsonProviderLinks JsonLinkFields


type alias JsonLinkFields =
    { links : List JsonLink
    }

源代码可以在here找到。

注意:我尝试研究此错误并遇到此page。 结果,我试图使用Decode.lazy函数。但是,我的尝试失败了。

1 个答案:

答案 0 :(得分:2)

在您的示例中,有很多依赖于其他解码器的解码器。您已将其中一些更改为使用Decode.lazy,但不是全部,并且当您发生某些失控递归时,您收到的错误将会发生。

您不需要列表才能使用lazy。尝试 - 作为调试的第一步,至少 - 更改引用其他解码器的所有解码器以使用Decode.lazy。例如:

sourceDecoder : Decoder JsonSource
sourceDecoder =
    Decode.map5 JsonSource
        ...
        (field "Links" (Decode.lazy (\_ -> providerLinksDecoder)))