Deserializar una lista JSON de cadenas hexadecimales como bytes
Estoy tratando de leer un flujo JSON, parte del cual se ve así:
json
"data": [
"c1a8f800a4393e0cacd05a5bc60ae3e0",
"bbac4013c1ca3482155b584d35dac185",
"685f237d4fcbd191c981b94ef6986cde",
"a08898e81f1ddb6612aa12641b856aa9"
]
(hay más entradas en la lista “data” y cada entrada es más larga, pero esto debería ser ilustrativo; tanto la longitud de la lista como la longitud de cada cadena hexadecimal se conocen en tiempo de compilación)
Idealmente, me gustaría tener un solo [u8; 64]
(el tamaño real se conoce en tiempo de compilación), o en caso contrario, un Vec<u8>
, pero imagino que sería más fácil deserializarlo como un Vec<[u8; 16]>
y luego fusionarlos posteriormente. Sin embargo, estoy teniendo problemas incluso para hacer eso.
La librería hex
tiene una forma de deserializar una única cadena hexadecimal como un Vec
o un arreglo de u8
, pero no puedo averiguar cómo decirle a Serde que haga eso para cada entrada de la lista. ¿Hay alguna manera sencilla de hacerlo que esté pasando por alto, o necesito escribir mi propio deserializador de listas?
davy.ai
Para deserializar una lista de cadenas hexadecimales como
Vec<[u8; 16]>
, puedes usar el paqueteserde_bytes
en combinación con el paquetehex
.Primero, agrega las siguientes dependencias a tu archivo
Cargo.toml
:Luego, puedes definir tu estructura de la siguiente manera:
Esto define una estructura
Data
con un campodata
, que se deserializa usando la funcióndeserialize_hex_list
. Esta función primero deserializa la lista de cadenas hexadecimales como unVec<string>
, luego convierte cada cadena hexadecimal a unVec<u8>
usando el métodofrom_hex
del paquetehex
, y finalmente convierte cadaVec<u8>
en un arreglo[u8; 16]
.Ten en cuenta que esta implementación asume que cada cadena hexadecimal tiene una longitud de 32 caracteres (16 bytes en representación hexadecimal), y que la longitud de la lista se conoce en tiempo de compilación. Si estas suposiciones no son válidas para tu caso de uso, es posible que necesites modificar el código en consecuencia.</vec<_></vec<[u8;>