我正在编写一个elm json解码器,并希望将值从"父"记录移动到"子".
在这个例子中,我想将beta键/值移动到Bar类型中.
我传入的JSON
{ "alpha": 1,
"beta: 2,
"bar": {
"gamma": 3
}
}
Run Code Online (Sandbox Code Playgroud)
我的类型
type alias Foo =
{ alpha : Int
, bar : Bar
}
type alias Bar =
{ beta : Int
, gamma : Int
}
Run Code Online (Sandbox Code Playgroud)
我怎么能在解码器中做到这一点?我觉得我想把解码器传递beta到fooDecode.但这显然是不对的......
fooDecode =
decode Foo
|> required "alpha" Json.Decode.int
|> required "bar" barDecode (Json.Decode.at "beta" Json.Decode.int)
barDecode betaDecoder =
decode Bar
|> betaDecoder
|> required "gamma" Json.Decode.int
Run Code Online (Sandbox Code Playgroud)
注意:我的实际用例有一个子列表,但希望我能用这个指针来解决这个问题.我正在使用Decode.Pipeline,因为它是一个大型的JSON对象
您可以使用Json.Decode.andThen此处解析"beta"然后将其传递给它barDecode并Json.Decode.Pipeline.custom使其与管道一起使用:
fooDecode : Decoder Foo
fooDecode =
decode Foo
|> required "alpha" Json.Decode.int
|> custom
(Json.Decode.field "beta" Json.Decode.int
|> Json.Decode.andThen (\beta -> Json.Decode.field "bar" (barDecode beta))
)
barDecode : Int -> Decoder Bar
barDecode beta =
decode Bar
|> hardcoded beta
|> required "gamma" Json.Decode.int
Run Code Online (Sandbox Code Playgroud)
随着这种变化,
main : Html msg
main =
Html.text <| toString <| decodeString fooDecode <| """
{ "alpha": 1,
"beta": 2,
"bar": {
"gamma": 3
}
}
"""
Run Code Online (Sandbox Code Playgroud)
打印:
Ok { alpha = 1, bar = { beta = 2, gamma = 3 } }
Run Code Online (Sandbox Code Playgroud)