手としては、「生のデータ構造を enum FooRaw { ... } のようにして serde 対応させて、本命の Foo は FooRaw を展開後にデフォルトの構造に揃えるようにする」みたいな方法
個人的にはこれが制約が型で見えるのとロジックが少なくなるので一番好みだけど、見掛け上のコード量は膨らんでしまう
一応補足しておくと、「Foo の Deserialize 実装の内部にて FooRaw の Deserialize 実装を呼ぶ」みたいなことをするという話です (そうすることで deserialize 後にユーザが手動で変換する必要がなくなる)