使用Elm Json.Decode将vales从父记录移动到子记录

Jon*_*Jon 1 elm

我正在编写一个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)

我怎么能在解码器中做到这一点?我觉得我想把解码器传递betafooDecode.但这显然是不对的......

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对象

Dog*_*ert 5

您可以使用Json.Decode.andThen此处解析"beta"然后将其传递给它barDecodeJson.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)