Files
google-apis-rs/serde_with_macros/attr.skip_serializing_none.html
2024-03-05 21:06:01 +01:00

63 lines
8.6 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Add `skip_serializing_if` annotations to `Option` fields."><title>skip_serializing_none in serde_with_macros - Rust</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../static.files/SourceSerif4-Regular-46f98efaafac5295.ttf.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href="../static.files/FiraSans-Regular-018c141bf0843ffd.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href="../static.files/FiraSans-Medium-8f9a781e4970d388.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href="../static.files/SourceCodePro-Regular-562dcc5011b6de7d.ttf.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href="../static.files/SourceCodePro-Semibold-d899c5a5c4aeb14a.ttf.woff2"><link rel="stylesheet" href="../static.files/normalize-76eba96aa4d2e634.css"><link rel="stylesheet" href="../static.files/rustdoc-ac92e1bbe349e143.css"><meta name="rustdoc-vars" data-root-path="../" data-static-root-path="../static.files/" data-current-crate="serde_with_macros" data-themes="" data-resource-suffix="" data-rustdoc-version="1.76.0 (07dca489a 2024-02-04)" data-channel="1.76.0" data-search-js="search-2b6ce74ff89ae146.js" data-settings-js="settings-4313503d2e1961c2.js" ><script src="../static.files/storage-f2adc0d6ca4d09fb.js"></script><script defer src="sidebar-items.js"></script><script defer src="../static.files/main-305769736d49e732.js"></script><noscript><link rel="stylesheet" href="../static.files/noscript-feafe1bb7466e4bd.css"></noscript><link rel="alternate icon" type="image/png" href="../static.files/favicon-16x16-8b506e7a72182f1c.png"><link rel="alternate icon" type="image/png" href="../static.files/favicon-32x32-422f7d1d52889060.png"><link rel="icon" type="image/svg+xml" href="../static.files/favicon-2c020d218678b618.svg"></head><body class="rustdoc attr"><!--[if lte IE 11]><div class="warning">This old browser is unsupported and will most likely display funky things.</div><![endif]--><nav class="mobile-topbar"><button class="sidebar-menu-toggle">&#9776;</button></nav><nav class="sidebar"><div class="sidebar-crate"><h2><a href="../serde_with_macros/index.html">serde_with_macros</a><span class="version">2.3.3</span></h2></div><div class="sidebar-elems"></div></nav><div class="sidebar-resizer"></div>
<main><div class="width-limiter"><nav class="sub"><form class="search-form"><span></span><div id="sidebar-button" tabindex="-1"><a href="../serde_with_macros/all.html" title="show sidebar"></a></div><input class="search-input" name="search" aria-label="Run search in the documentation" autocomplete="off" spellcheck="false" placeholder="Click or press S to search, ? for more options…" type="search"><div id="help-button" tabindex="-1"><a href="../help.html" title="help">?</a></div><div id="settings-menu" tabindex="-1"><a href="../settings.html" title="settings"><img width="22" height="22" alt="Change settings" src="../static.files/wheel-7b819b6101059cd0.svg"></a></div></form></nav><section id="main-content" class="content"><div class="main-heading"><h1>Attribute Macro <a href="index.html">serde_with_macros</a>::<wbr><a class="attr" href="#">skip_serializing_none</a><button id="copy-path" title="Copy item path to clipboard"><img src="../static.files/clipboard-7571035ce49a181d.svg" width="19" height="18" alt="Copy item path"></button></h1><span class="out-of-band"><a class="src" href="../src/serde_with_macros/lib.rs.html#319-328">source</a> · <button id="toggle-all-docs" title="collapse all docs">[<span>&#x2212;</span>]</button></span></div><pre class="rust item-decl"><code>#[skip_serializing_none]</code></pre><details class="toggle top-doc" open><summary class="hideme"><span>Expand description</span></summary><div class="docblock"><p>Add <code>skip_serializing_if</code> annotations to <a href="https://doc.rust-lang.org/1.76.0/core/option/enum.Option.html" title="enum core::option::Option"><code>Option</code></a> fields.</p>
<p>The attribute can be added to structs and enums.
The <code>#[skip_serializing_none]</code> attribute must be placed <em>before</em> the <code>#[derive]</code> attribute.</p>
<h2 id="example"><a href="#example">Example</a></h2>
<p>JSON APIs sometimes have many optional values.
Missing values should not be serialized, to keep the serialized format smaller.
Such a data type might look like:</p>
<div class="example-wrap"><pre class="rust rust-example-rendered"><code><span class="attr">#[derive(Serialize)]
</span><span class="kw">struct </span>Data {
<span class="attr">#[serde(skip_serializing_if = <span class="string">"Option::is_none"</span>)]
</span>a: <span class="prelude-ty">Option</span>&lt;String&gt;,
<span class="attr">#[serde(skip_serializing_if = <span class="string">"Option::is_none"</span>)]
</span>b: <span class="prelude-ty">Option</span>&lt;u64&gt;,
<span class="attr">#[serde(skip_serializing_if = <span class="string">"Option::is_none"</span>)]
</span>c: <span class="prelude-ty">Option</span>&lt;String&gt;,
<span class="attr">#[serde(skip_serializing_if = <span class="string">"Option::is_none"</span>)]
</span>d: <span class="prelude-ty">Option</span>&lt;bool&gt;,
}</code></pre></div>
<p>The <code>skip_serializing_if</code> annotation is repetitive and harms readability.
Instead, the same struct can be written as:</p>
<div class="example-wrap"><pre class="rust rust-example-rendered"><code><span class="attr">#[skip_serializing_none]
#[derive(Serialize)]
</span><span class="kw">struct </span>Data {
a: <span class="prelude-ty">Option</span>&lt;String&gt;,
b: <span class="prelude-ty">Option</span>&lt;u64&gt;,
c: <span class="prelude-ty">Option</span>&lt;String&gt;,
<span class="comment">// Always serialize field d even if None
</span><span class="attr">#[serialize_always]
</span>d: <span class="prelude-ty">Option</span>&lt;bool&gt;,
}</code></pre></div>
<p>Existing <code>skip_serializing_if</code> annotations will not be altered.</p>
<p>If some values should always be serialized, then <code>serialize_always</code> can be used.</p>
<h2 id="limitations"><a href="#limitations">Limitations</a></h2>
<p>The <code>serialize_always</code> cannot be used together with a manual <code>skip_serializing_if</code> annotations,
as these conflict in their meaning. A compile error will be generated if this occurs.</p>
<p>The <code>skip_serializing_none</code> only works if the type is called <a href="https://doc.rust-lang.org/1.76.0/core/option/enum.Option.html" title="enum core::option::Option"><code>Option</code></a>,
<a href="https://doc.rust-lang.org/1.76.0/core/option/enum.Option.html" title="enum core::option::Option"><code>std::option::Option</code></a>, or <a href="https://doc.rust-lang.org/1.76.0/core/option/enum.Option.html" title="enum core::option::Option"><code>core::option::Option</code></a>. Type aliasing an <a href="https://doc.rust-lang.org/1.76.0/core/option/enum.Option.html" title="enum core::option::Option"><code>Option</code></a> and giving it
another name, will cause this field to be ignored. This cannot be supported, as proc-macros run
before type checking, thus it is not possible to determine if a type alias refers to an
<a href="https://doc.rust-lang.org/1.76.0/core/option/enum.Option.html" title="enum core::option::Option"><code>Option</code></a>.</p>
<div class="example-wrap"><pre class="rust rust-example-rendered"><code><span class="kw">type </span>MyOption&lt;T&gt; = <span class="prelude-ty">Option</span>&lt;T&gt;;
<span class="attr">#[skip_serializing_none]
#[derive(Serialize)]
</span><span class="kw">struct </span>Data {
a: MyOption&lt;String&gt;, <span class="comment">// This field will not be skipped
</span>}</code></pre></div>
<p>Likewise, if you import a type and name it <code>Option</code>, the <code>skip_serializing_if</code> attributes will
be added and compile errors will occur, if <code>Option::is_none</code> is not a valid function.
Here the function <code>Vec::is_none</code> does not exist, and therefore the example fails to compile.</p>
<div class="example-wrap compile_fail"><a href="#" class="tooltip" title="This example deliberately fails to compile"></a><pre class="rust rust-example-rendered"><code><span class="kw">use </span>std::vec::Vec <span class="kw">as </span><span class="prelude-ty">Option</span>;
<span class="attr">#[skip_serializing_none]
#[derive(Serialize)]
</span><span class="kw">struct </span>Data {
a: <span class="prelude-ty">Option</span>&lt;String&gt;,
}</code></pre></div>
</div></details></section></div></main></body></html>