Hi all!
I'm having difficulties getting some json to play nicely.
For an MWE I have an input
field that can take a few different types, but only one of them at a time. So that's simple: I can use an enum
. My issue is that the source json (which I have no control over) is wrapped a few levels deep.
{
"inner": {
"name": "inner_name",
"data": "test"
}
}
Is one possibility for input
, but it could also be
{ "join: [
{
"inner": {
"name": "inner_name_one",
"data": "test_one"
}
},
{
"inner": {
"name": "inner_name_two",
"data": "test_two"
}
},
{
"inner": {
"name": "inner_name_tree",
"data": "test_three"
}
}
]
}
What I have at the moment:
// serde, serde_json
#[derive(Debug, Deserialize)]
struct Inner {
name: String,
data: String
}
#[derive(Debug, Deserialize)]
struct WrappedInner {
inner: Inner
}
#[derive(Debug, Deserialize)]
#[serde(rename_all = "lowercase")]
enum Input {
Inner(Inner),
Join(Vec<WrappedInner>),
}
What I would like:
#[derive(Debug, Deserialize)]
#[serde(rename_all = "lowercase")]
enum Input {
Inner(Inner),
Join(Vec<Inner>),
}
I've tried to write custom Deserialize and Visitor traits for Inner
and successfully managed to get the Join
case to parse to Join(Vec<Inner>)
, but failed to generalise this, since the Inner
enum call would then fail.
Any ideas on how best to approach this conversion?