2017-09-15 24 views
0

如何实现由于其中一个字段具有相同类型而自行调用的解码器?如何实现由于其中一个字段具有相同类型而自行调用的解码器?

providerDecoder : Decoder JsonProvider 
providerDecoder = 
    Decode.map6 JsonProvider 
     (field "Profile" profileDecoder) 
     (field "Topics" <| Decode.list topicDecoder) 
     (field "Links" <| linksDecoder) 
     (field "RecentLinks" <| Decode.list linkDecoder) 
     (field "Subscriptions" <| Decode.list providerDecoder) 
     (field "Followers" <| Decode.list providerDecoder) 

以下行导致问题:

(field "Subscriptions" <| Decode.list providerDecoder) 
(field "Followers" <| Decode.list providerDecoder) 

providerDecoder是本身来直接定义,引起 无限

总之,我不知道怎么样在仍然保留JsonProvider类型的同时解决此错误。

附录:

type JsonProvider 
    = JsonProvider 
     { profile : JsonProfile 
     , topics : List JsonTopic 
     , links : JsonLinks 
     , recentLinks : List JsonLink 
     , subscriptions : List JsonProvider 
     , followers : List JsonProvider 
     } 

回答

3

当你写递归JSON解码器,你通常都要靠Json.Decode.lazy。你可以写这两条线,因为这:

(field "Subscriptions" <| Decode.list (Decode.lazy (\_ -> providerDecoder))) 
(field "Followers" <| Decode.list (Decode.lazy (\_ -> providerDecoder))) 

一旦你改变,你会看到另一个错误信息弹出约不匹配起来的类型,那是因为你使用一个构造函数联合类型它有一个记录作为参数(在编写递归记录类型时这是必需的)。在这种情况下,我通常分离出的构造和记录类型是这样的:

type JsonProvider 
    = JsonProvider JsonProviderFields 

type alias JsonProviderFields = 
    { profile : JsonProfile 
    , topics : List JsonTopic 
    , links : JsonLinks 
    , recentLinks : List JsonLink 
    , subscriptions : List JsonProvider 
    , followers : List JsonProvider 
    } 

现在你可以重写提供解码器首先解码JsonProviderFields记录,然后将其映射到JsonProvider

providerDecoder : Decoder JsonProvider 
providerDecoder = 
    Decode.map6 JsonProviderFields 
     (field "Profile" profileDecoder) 
     (field "Topics" <| Decode.list topicDecoder) 
     (field "Links" <| linksDecoder) 
     (field "RecentLinks" <| Decode.list linkDecoder) 
     (field "Subscriptions" <| Decode.list (Decode.lazy (\_ -> providerDecoder))) 
     (field "Followers" <| Decode.list (Decode.lazy (\_ -> providerDecoder))) 
     |> Decode.map JsonProvider 
相关问题