Mam obiekt JSON:

{"content":{"foo":1,"bar":2},"signature":"3f5ab1..."}

Deserycjonowanie tego do typu niestandardowego działa już dobrze, używając:

let s: SignedContent = serde_json::from_str(string)?;

Chcę {"foo":1,"bar":2} jako plasterek &[u8], dzięki czemu mogę sprawdzić podpis.

(Jestem świadomy problemów wokół kanonicznych reprezentacji JSON i mają złagodzenie na miejscu.)

Obecnie jestem marnotrawnie RE-Serialising obiekt Content (w obiekcie SignedContent) do łańcucha i uzyskania oktetów.

Czy jest bardziej wydajny sposób?

4
fadedbee 4 październik 2020, 10:58

1 odpowiedź

Najlepsza odpowiedź

Wygląda na to, że praca dla {X0}} (który jest dostępny z funkcją "Raw_value").

Odniesienie do szeregu bajtów obejmującej jedną poprawną wartość JSON w danych wejściowych.

A RawValue może być używany do odroczenia części ładunku do później, lub uniknąć analizowania go w ogóle w przypadku, gdy część ładunku musi być przeniesiona werbatim w inny obiekt wyjściowy.

Po serializowaniu wartości tego typu zachowuje swoje oryginalne formatowanie i nie zostanie złożony lub ładny.

Z wykorzystaniem:

#[derive(Deserialize)]
struct SignedContent<'a> {

    #[serde(borrow)]
    content: &'a RawValue,

    // or without the 'a
    //content: Box<RawValue>
}

Następnie możesz użyć content.get(), aby uzyskać surowe {x1}}.

4
kmdreko 4 październik 2020, 09:09