#json #deserialize-json #postgresql #sqlx #json-query #decode #transparent

sqlx-transparent-json-decode

Decode JSON from Postgres sqlx queries, without the Json<> wrapper type

8 stable releases

3.0.0 Jul 23, 2024
2.2.2 Apr 24, 2024
2.2.1 Mar 27, 2024
2.1.0 Nov 27, 2023
1.0.0 May 27, 2023

#539 in Encoding

Download history 348/week @ 2024-07-14 388/week @ 2024-07-21 575/week @ 2024-07-28 631/week @ 2024-08-04 568/week @ 2024-08-11 645/week @ 2024-08-18 345/week @ 2024-08-25 311/week @ 2024-09-01 304/week @ 2024-09-08 378/week @ 2024-09-15 221/week @ 2024-09-22 251/week @ 2024-09-29 411/week @ 2024-10-06 320/week @ 2024-10-13 191/week @ 2024-10-20

927 downloads per month
Used in 3 crates

MIT/Apache

18KB
299 lines

sqlx-transparent-json-decode

docs.rs docs Download

This crate is meant for use with sqlx and allows you to query JSON or JSONB fields from PostgreSQL without needing to wrap the types in a sqlx::types::Json<> wrapper type.

use serde::{Deserialize, Serialize};
use sqlx_transparent_json_decode::sqlx_json_decode;

#[derive(Serialize, Deserialize)]
pub struct SomeJsonField {
    // Whatever fields match the JSON structure
    pub name: String,
    pub some_param: Option<String>,
    pub count: i32,
}

sqlx_json_decode!(SomeJsonField);

#[derive(sqlx::FromRow)]
pub struct QueryResult {
    pub id: i32,
    pub name: String,
    pub params: SomeJsonField,
}

Normally, you would need to use Json<SomeJsonField> as the type for params in the above example. This crate allows you to use SomeJsonField directly.

let result = sqlx::query_as!(
    QueryResult,
    r##"SELECT id,
        name,
        params as "params: SomeJsonField"
      FROM some_table"##,
).fetch_one(&pool).await?;

This crate also provides BoxedRawValue, a wrapper around Box<serde_json::value::RawValue> which can be decoded directly. This is otherwise difficult to do using sqlx's query macros.

let result = sqlx::query!(
    r##"SELECT id, data as "data: BoxedRawValue" FROM table##"
).fetch_one(&pool).await?;

Dependencies

~13–24MB
~380K SLoC