Как частично десериализовать объект JSON?

#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 .