标签: serde

有没有办法删除使用 serde 序列化的结构中的 None 字段?

我正在尝试从 MongoDB 获取用户信息,如下所示:

\n
pub async fn find_user_by_name(&self, data: String) -> Vec<Uye> {\n    let filter = doc! {"isim": data};\n    let options = FindOptions::builder()\n        .projection(doc! {"sifre": 0, "mail": 0, "tokenInfo": 0 })\n        .build();\n    let cursor = match self.user_col.find(None, options).await {\n        std::result::Result::Ok(cursor) => cursor,\n        std::result::Result::Err(_) => return vec![],\n    };\n\n    cursor.try_collect().await.unwrap()\n}\n
Run Code Online (Sandbox Code Playgroud)\n

我的 Uye 结构是:

\n
pub struct Uye {\n    pub id: Option<i32>,\n    pub isim: Option<String>,\n    pub sifre: Option<String>,\n    pub mail: Option<String>,\n    pub dogumtarihi: Option<String>,\n    pub avatar_url: Option<String>,\n    pub kaydedilen: Option<Vec<i32>>,\n    pub perm: …
Run Code Online (Sandbox Code Playgroud)

rust serde

3
推荐指数
1
解决办法
834
查看次数

Serde JSON 反序列化枚举

我有一个枚举:

#[derive(Serialize, Deserialize)]
enum Action {
    Join,
    Leave,
}
Run Code Online (Sandbox Code Playgroud)

和一个结构:

#[derive(Serialize, Deserialize)]
struct Message {
    action: Action,
}
Run Code Online (Sandbox Code Playgroud)

我传递了一个 JSON 字符串:

"{\"action\":0}" // `json_string` var
Run Code Online (Sandbox Code Playgroud)

但是当我尝试像这样反序列化时:

let msg: Message = serde_json::from_str(json_string)?;
Run Code Online (Sandbox Code Playgroud)

我得到了错误expected value at line 1 column 11

在 JSON 中,如果我用0字符串替换数字"Join",它会起作用,但我希望数字对应于Action枚举的值(0is Action::Join1is Action::Leave),因为它来自 TypeScript 请求。有没有一种简单的方法可以实现这一目标?

enums json rust serde

3
推荐指数
1
解决办法
2054
查看次数

serde 反序列化空数组时如何出错

我希望反序列化使空数组失败。以下代码有效,但我想让这个特定案例失败:

use serde::Deserialize;

#[derive(Debug)]
#[derive(Deserialize)]
struct Doc {
    nums: Vec<i32>
}

fn main(){
    let data = r#"
        {"nums": []}
    "#;
    let doc: Doc = serde_json::from_str(data).unwrap();
    dbg!(doc);
}
Run Code Online (Sandbox Code Playgroud)

有什么选择可以实现这一目标?

rust serde serde-json

3
推荐指数
1
解决办法
264
查看次数

如何将复杂的 JSON 反序列化为 Rust 类型?

我正在尝试构建一个 Tauri 应用程序。当尝试将数据从我的前端反序列化到我的 Rust 后端(以 JSON 形式传递)时,我遇到一个错误,我不知道如何修复。

JSON 遵循以下架构:

{
    positive: ICriterion[],
    negative: ICriterion[],
}

ICriterion {
    name: 'tribunal'|appealCourt'|'group'|'role'|'prevalent_domain'|'placed',
    label: string,
    value: number[]|string|bool
}
Run Code Online (Sandbox Code Playgroud)

value我们尝试使用 Rust Enum实现字段的联合类型:

#[derive(Deserialize)]
pub struct SortDataInput {
    positive: Vec<Criterion>,
    negative: Vec<Criterion>,
}

#[derive(Deserialize)]
pub enum CriterionValue {
    IntegerArray(Vec<i32>),
    Name(String),
    Boolean(bool),
}

#[derive(Deserialize)]
pub struct Criterion {
    name: String,
    value: CriterionValue,
}
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试执行我的方法时,出现错误,指出“Civil”(可能是字符串值)是未知变体。

我猜我们设置 Rust 枚举的方式有问题,但由于我们是 Rust 的初学者,我们无法真正弄清楚如何修复它。

您将如何为 Serde 创建正确的类型以轻松反序列化我们的 JSON?

json rust serde tauri

3
推荐指数
1
解决办法
300
查看次数

我可以在 Rust 中序列化 struct camel_case 并反序列化 PascalCase

我有一个结构,我希望能够在camel_case中序列化并在PascalCase中反序列化。这可能吗?我见过塞尔德rename_all = snake_case

rust serde

3
推荐指数
1
解决办法
681
查看次数

在 FromForm 中反序列化 JSON 时的生命周期

我无法理解这段代码的生命周期之间的关系。基本上,我有一个接收一些x-www-form-urlencoded数据的 Rocket API,只有一个键:json. 这个键直观地包含一个 JSON 值,用百分比编码,一个 struct Message<T>

(我知道这是次优的 API 设计,但这是逆向工程工作,所以我别无选择)

为了方便地用作请求保护器From<Message<T>>,我正在实现FromForm. 为此,我需要FromForm<'f>为任何Message<T>where Timplements 实现Deserialize<'de>。我将我的 impl 签名写为impl<'f, 'de, T> FromForm<'f> for Message<T> where T: Deserialize<'de>.

为了实际执行解码,我:

  1. 获取"json"表单数据的key;
  2. URL 解码值;
  3. 解析值中包含的 JSON。

尽快脱险。这样做的代码(为方便读者使用显式类型注释):

fn from_form(items: &mut FormItems<'f>, strict: bool) -> Result<Self, Self::Error> {
    // Get JSON field
    let encoded: Option<&RawStr> = items.find(|&(k, _)| k.as_str() == "json")
        .map(|(_, v)| v);
    if let …
Run Code Online (Sandbox Code Playgroud)

rust serde rust-rocket

2
推荐指数
1
解决办法
552
查看次数

Clap 无法解析 YAML 文件:未能将 YAML String("1") 值转换为字符串

我使用 YAML 文件来定义我的命令行界面。我使用 Clap 的load_yaml!宏解析文件,一段时间后效果很好:

#[macro_use]
extern crate clap;
use clap::{App, ArgMatches};

fn main() {
    let yml = load_yaml!("cl_arguments.yml");
    let matches = App::from_yaml(yml).get_matches();
    # some code goes here
}
Run Code Online (Sandbox Code Playgroud)

没有我对相关代码进行任何更改,这停止工作,我收到以下错误:

#[macro_use]
extern crate clap;
use clap::{App, ArgMatches};

fn main() {
    let yml = load_yaml!("cl_arguments.yml");
    let matches = App::from_yaml(yml).get_matches();
    # some code goes here
}
Run Code Online (Sandbox Code Playgroud)

我不确定这是否应该归咎于更新。我更新了 Rust 并删除了 Cargo.lock 以排除不兼容问题,但这并没有帮助。

这是产生错误的 YAML 文件的最小版本:

name: "tool"
version: "0.1"
about: "description"
author: "m00am"

subcommands:
  - subcommand1:
      args:
        - path:
            index: "1" …
Run Code Online (Sandbox Code Playgroud)

rust serde clap

2
推荐指数
1
解决办法
914
查看次数

如何在不包含枚举变体名称的情况下序列化枚举?

我试图将枚举序列化为JSON字符串.我Serialize为我的枚举实现了特征,因为它在文档中有描述,但我总是得到{"offset":{"Int":0}}而不是想要的{"offset":0}.

extern crate serde;
extern crate serde_json;

use std::collections::HashMap;

use serde::ser::{Serialize, Serializer};

#[derive(Debug)]
enum TValue<'a> {
    String(&'a str),
    Int(&'a i32),
}

impl<'a> Serialize for TValue<'a> {
    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
    where
        S: Serializer,
    {
        match *self {
            TValue::String(ref s) => serializer.serialize_newtype_variant("TValue", 0, "String", s),
            TValue::Int(i) => serializer.serialize_newtype_variant("TValue", 1, "Int", &i),
        }
    }
}

fn main() {
    let offset: i32 = 0;
    let mut request_body = HashMap::new();
    request_body.insert("offset", TValue::Int(&offset));
    let serialized = …
Run Code Online (Sandbox Code Playgroud)

serialization rust serde serde-json

2
推荐指数
1
解决办法
647
查看次数

为什么Serde无法为仅包含&Path的结构派生反序列化?

我试图派生serde::Deserialize一个包含对的引用的结构Path。这产生了一条错误消息,如果您将其替换&'a Path为,则不会发生&'a str。是什么引起了不同的行为#[derive(Deserialize)]

操场

#!/bin/cargo script
//! ```cargo
//! [dependencies]
//! serde_derive="1.0"
//! serde="1.0"
//! ```

extern crate serde_derive;

use serde_derive::*;

#[derive(Deserialize)]
struct A<'a> {
    a: &'a std::path::Path,
    //a: &'a str,
}

fn main() {}
Run Code Online (Sandbox Code Playgroud)
error[E0495]: cannot infer an appropriate lifetime for lifetime parameter `'de` due to conflicting requirements
 --> src/main.rs:7:5
  |
7 |     a: &'a std::path::Path,
  |     ^
  |
note: first, the lifetime cannot outlive the lifetime 'de as …
Run Code Online (Sandbox Code Playgroud)

rust serde

2
推荐指数
1
解决办法
148
查看次数

期货-预期(),找到结构期货::地图

我试图用Hyper发送一个请求,然后通过Serde通过JSON反序列化它,但是我似乎无法束手无策,我收到了类型不匹配错误的说明expected (), found struct [put some odd struct here]。我也无法绕过每次更改都会吐出的令人难以置信的冗长而令人困惑的错误消息。这是我的代码:

extern crate futures;
extern crate hyper;
extern crate serde;
extern crate serde_json;

use futures::{
    Future,
    Stream,
    future
};
use hyper::{
    Body,
    Client,
    Response,
    StatusCode,
    Uri,
    client::HttpConnector,
};
use serde::{ Deserialize };
use std::error::{ Error };

enum JsonError
{
    RequestError(hyper::Error),
    ResponseError(StatusCode),
    DeserializeError(serde_json::Error),
}

fn get_json
    <'t, T, F>
    (client: &Client<HttpConnector>, uri: Uri)
-> impl Future<Item = T, Error = JsonError>
where
    T : Deserialize<'t> …
Run Code Online (Sandbox Code Playgroud)

rust hyper serde

2
推荐指数
1
解决办法
100
查看次数

标签 统计

rust ×10

serde ×10

json ×2

serde-json ×2

clap ×1

enums ×1

hyper ×1

rust-rocket ×1

serialization ×1

tauri ×1