#prog #rust #serde #article
У serde не самая интуитивная архитектура. В данной паре статей автор попытался показать её на примере. В первой статье автор разбирает код для десериализации, сгенерированный derive для простого примера. Во второй статье автор показывает, как самостоятельно написать десериализатор для простого формата.
У serde не самая интуитивная архитектура. В данной паре статей автор попытался показать её на примере. В первой статье автор разбирает код для десериализации, сгенерированный derive для простого примера. Во второй статье автор показывает, как самостоятельно написать десериализатор для простого формата.
#prog #rust #serde
В serde_json есть тип Value, который может представить любое валидное JSON-значение. Есть парочка вещей, которые не столь известны и стоят упоминания.
1.
2. В
3.
4. Если вам нужно достать глубоко вложенное значение, можно вместо череды индексаций или вызовов
6. У
В serde_json есть тип Value, который может представить любое валидное JSON-значение. Есть парочка вещей, которые не столь известны и стоят упоминания.
1.
Value, а также обе разновидности ссылок на него могут быть сравнены на равенство со всеми примитивными числами, bool, str и String.2. В
Value можно сконвертировать из множества различных типов, которые могут входить в его состав, а также составлять из итератора по элементам и итератора по элементам вместе с ключами.3.
Value можно индексировать как строками, так и числовыми индексами, при этом в случае, если индексировать значение таким образом нельзя, иммутабельное индексирование вместо паники возвращает ссылку на Value::Null.4. Если вам нужно достать глубоко вложенное значение, можно вместо череды индексаций или вызовов
get использовать метод pointer/pointer_mut, которые достают значение по указанному строковому пути:let data = json!({
"x": {
"y": ["z", "zz"]
}
});
assert_eq!(data.pointer("/x/y/1").unwrap(), &json!("zz"));
assert_eq!(data.pointer("/a/b/c"), None);
5. Value и &Value реализуют Deserialize. Это значит, что если у вас есть разобранный JSON в неструктурированном виде, вы можете сконвертировать его в свои типы, реализующие Deserialize — причём в случае со ссылкой у вас при этом останется изначальный JSON. Так можно пробовать десериализовывать поочерёдно в несколько типов, и это может оказаться дешевле, чем парсить всё с нуля.6. У
Value есть собрат RawValue. Этот тип фактически представляет собой синтаксически валидный JSON, который хранится в виде слайса на входную строку. Его можно использовать для того, чтобы проводить манипуляции над JSON и при этом не хранить разобранный JSON в памяти целиком:use serde::{Deserialize, Serialize};
use serde_json::{Result, value::RawValue};
#[derive(Deserialize)]
struct Input<'a> {
code: u32,
#[serde(borrow)]
payload: &'a RawValue,
}
#[derive(Serialize)]
struct Output<'a> {
info: (u32, &'a RawValue),
}
// Efficiently rearrange JSON input containing separate "code" and "payload"
// keys into a single "info" key holding an array of code and payload.
//
// This could be done equivalently using serde_json::Value as the type for
// payload, but &RawValue will perform better because it does not require
// memory allocation. The correct range of bytes is borrowed from the input
// data and pasted verbatim into the output.
fn rearrange(input: &str) -> Result<String> {
let input: Input = serde_json::from_str(input)?;
let output = Output {
info: (input.code, input.payload),
};
serde_json::to_string(&output)
}
fn main() -> Result<()> {
let out = rearrange(r#" {"code": 200, "payload": {}} "#)?;
assert_eq!(out, r#"{"info":[200,{}]}"#);
Ok(())
}docs.rs
Value in serde_json - Rust
Represents any valid JSON value.
👍10
Блог*
#prog #rust #rustlib #serde #amazingopensource Хозяйке на заметку Подборка библиотек для работы с serde от замечательного Толяна dtolnay. erased-serde — трейты из serde со стёртыми типами. Позволяют сделать из (де)сериализаторов трейт-объекты. Обычно это…
#prog #rust #serde #article
Exploring Traits with Erased ‘serde’ — статья с демонстрацией того, как erased-serde выглядит на практике и где это может пригодиться
Exploring Traits with Erased ‘serde’ — статья с демонстрацией того, как erased-serde выглядит на практике и где это может пригодиться
The Coded Message
Exploring Traits with Erased 'serde'
I came across a programming problem recently where I wanted to use dynamic polymorphism with serde. This turned out to be much easier than I expected, and I thought it was an interesting enough case study to share, especially for people who are learning Rust.…
#prog #rust #serde #suckassstory
t.iss.one/psauxww/923
И да, де-факто эта строчка-индикатор настолько часто захардкожена в проектах на Rust, что есть предложение сделать её публичной.
t.iss.one/psauxww/923
И да, де-факто эта строчка-индикатор настолько часто захардкожена в проектах на Rust, что есть предложение сделать её публичной.
Telegram
Segment@tion fault
У serde_json есть такая "приятная" особенность, как поддержка arbitrary precision numbers.
Оно, безусловно, хорошо в тех кейсах, где действительно нужна длинная математика. Но рассмотрим такой пример:
Alice
let val: serde_json::Value = json!({"number":1234567890});…
Оно, безусловно, хорошо в тех кейсах, где действительно нужна длинная математика. Но рассмотрим такой пример:
Alice
let val: serde_json::Value = json!({"number":1234567890});…
😱6🖕1
#prog #rust #serde #rustlib
ijson — более эффективная по памяти альтернатива serde_json::Value.
This crate offers a replacement for
As a ballpark figure, it will typically use half as much memory as serde-json when deserializing a value and the memory footprint of cloning a value is more than 7x smaller.
The primary type exposed by this crate is the
ijson — более эффективная по памяти альтернатива serde_json::Value.
This crate offers a replacement for
serde-json’s Value type, which is significantly more memory efficient.As a ballpark figure, it will typically use half as much memory as serde-json when deserializing a value and the memory footprint of cloning a value is more than 7x smaller.
The primary type exposed by this crate is the
IValue type. It is guaranteed to be pointer-sized and has a niche (so Option<IValue> is also guaranteed to be pointer-sized).crates.io
crates.io: Rust Package Registry
❤5🤣1
#prog #rust #serde #article
Faster Rust Serialization
Или несколько советов о том, как делать меньше лишней работы при сериализации с использованием serde.
Faster Rust Serialization
Или несколько советов о том, как делать меньше лишней работы при сериализации с использованием serde.
Mo8It
Faster Rust Serialization
How to speed up serialization in Rust by more than 2x
👍4👎1
Блог*
😒🤚 miniserde 😏👉 сердечко
#prog #rust #rustlib
miniserde — библиотека для (де)сериализации из/в JSON. В отличие от #serde, довольно ограничена, практически лишена опций для кастомизации и генерирует код, который использует трейт-объекты вместо дженериков. За счёт последнего компилируется значительно быстрее serde и при этом не сильно уступает в производительности.
miniserde — библиотека для (де)сериализации из/в JSON. В отличие от #serde, довольно ограничена, практически лишена опций для кастомизации и генерирует код, который использует трейт-объекты вместо дженериков. За счёт последнего компилируется значительно быстрее serde и при этом не сильно уступает в производительности.
Lib.rs
Miniserde — Rust data encoding library
Data structure serialization library with several opposite design goals from Serde
😍7🤡3👍1🥴1
#prog #rust #serde #article
Be Careful Zero-Copying Strings with serde
TL;DR: из-за того, что строки во многих форматах передачи данных (JSON, например) требуют экранирования специальных символов, строки с подобными символами не могут быть десериализованы в
Be Careful Zero-Copying Strings with serde
TL;DR: из-за того, что строки во многих форматах передачи данных (JSON, например) требуют экранирования специальных символов, строки с подобными символами не могут быть десериализованы в
&str (которые указывают на данные из входа). Для того, чтобы поддержать подобные строки, но по мере возможности все же не копировать данные, используйте Cow<str> с атрибутом #[serde(borrow)] на поле.💯8❤3👌2