#rust #serde #serde-json
#Ржавчина #serde #serde-json
Вопрос:
У меня есть объект JSON:
{"content":{"foo":1,"bar":2},"signature":"3f5ab1..."}
Десериализация этого в пользовательский тип уже работает нормально, используя:
let s: SignedContent = serde_json::from_str(string)?;
То, что я хочу {"foo":1,"bar":2}
, amp;[u8]
— это фрагмент, чтобы я мог проверить подпись.
(Я знаю о проблемах, связанных с каноническими представлениями JSON, и у меня есть меры по их устранению.)
В настоящее время я расточительно повторно сериализую Content
объект (внутри SignedContent
объекта) в строку и получаю из нее октеты.
Есть ли более эффективный способ?
Ответ №1:
Похоже на задание для serde_json::value::RawValue
(которое доступно с функцией «raw_value»).
Ссылка на диапазон байтов, охватывающий одно допустимое значение JSON во входных данных.
A
RawValue
может использоваться для отсрочки синтаксического анализа частей полезной нагрузки на более поздний срок или для того, чтобы вообще избежать ее синтаксического анализа в случае, если часть полезной нагрузки просто нужно передать дословно в другой выходной объект.При сериализации значение этого типа сохранит свое исходное форматирование и не будет уменьшено или напечатано красиво.
При использовании:
#[derive(Deserialize)]
struct SignedContent<'a> {
#[serde(borrow)]
content: amp;'a RawValue,
// or without the 'a
//content: Box<RawValue>
}
Затем вы можете использовать content.get()
для получения raw amp;str
.