Yes, I'd use a custom untagged enum[1]:
use serde::{Deserialize, Serialize};
#[derive(Serialize, Deserialize, Debug)]
pub struct Test {
pub field_1: ScalarOrVec,
}
#[derive(PartialEq, Debug, Serialize, Deserialize)]
#[serde(untagged)]
pub enum ScalarOrVec {
Scalar(u8),
Vec(Vec<u8>),
}
fn main() {
let json_u8 = r#"{ "field_1": 0 }"#;
let json_vec_u8 = r#"{ "field_1": [0, 1, 9] }"#;
let res_u8: Test = serde_json::from_str(json_u8).unwrap();
assert_eq!(res_u8.field_1, ScalarOrVec::Scalar(0));
let res_vec_u8: Test = serde_json::from_str(json_vec_u8).unwrap();
assert_eq!(res_vec_u8.field_1, ScalarOrVec::Vec(vec![0, 1, 9]));
}