[][src]Crate serde_query

A query language for Serde data model.

This crate provides DeserializeQuery trait and its derive macro for defining a query.

Example

use serde_query::{DeserializeQuery, Query};

#[derive(DeserializeQuery)]
struct Data {
    #[query(".commit.authors.[0]")]
    first_author: String,
    #[query(".hash")]
    hash_value: u64,
}

let document = serde_json::to_string(&serde_json::json!({
    "commit": {
        "authors": ["Kou", "Kasumi", "Masaru"],
        "date": "2020-09-10",
    },
    "hash": 0xabcd,
}))?;

// You can use `Query<T>` as a `Deserialize` type for any `Deserializer`
// and convert the result to the desired type using `From`/`Into`.
let data: Data = serde_json::from_str::<Query<Data>>(&document)?.into();

assert_eq!(data.first_author, "Kou");
assert_eq!(data.hash_value, 0xabcd);

Deriving DeserializeQuery

To declare a query, put #[derive(DeserializeQuery)] on your type. Each field must have a #[query(...)] attribute for specifying which part of the document should be retrieved, starting from the root.

#[query(...)] syntax

serde-query currently supports the following syntax for stepping one level inside the document. You can combine them to go further.

  • .field for accessing a field with a name field of an object. The field name must be an alphabet followed by zero or more alphanumeric characters.
  • .["field"] if the field name contains special characters. We recommend using a raw string literal for the query parameter (#[query(r#"..."#)]).
  • .[index] for accessing an array element at position index.

Note that mixing field access and index access at the same position of a document is a compile error.

Traits

DeserializeQuery

A data structure that can be deserialized with a query.

Type Definitions

Query

Convenient type alias for the query type.

Derive Macros

DeserializeQuery

Derive macro for DeserializeQuery trait.