我正在尝试从 MongoDB 获取用户信息,如下所示:
\npub 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 结构是:
\npub 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) 我有一个枚举:
#[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
枚举的值(0
is Action::Join
、1
is Action::Leave
),因为它来自 TypeScript 请求。有没有一种简单的方法可以实现这一目标?
我希望反序列化使空数组失败。以下代码有效,但我想让这个特定案例失败:
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)
有什么选择可以实现这一目标?
我正在尝试构建一个 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?
我有一个结构,我希望能够在camel_case中序列化并在PascalCase中反序列化。这可能吗?我见过塞尔德rename_all = snake_case
我无法理解这段代码的生命周期之间的关系。基本上,我有一个接收一些x-www-form-urlencoded
数据的 Rocket API,只有一个键:json
. 这个键直观地包含一个 JSON 值,用百分比编码,一个 struct Message<T>
。
(我知道这是次优的 API 设计,但这是逆向工程工作,所以我别无选择)
为了方便地用作请求保护器From<Message<T>>
,我正在实现FromForm
. 为此,我需要FromForm<'f>
为任何Message<T>
where T
implements 实现Deserialize<'de>
。我将我的 impl 签名写为impl<'f, 'de, T> FromForm<'f> for Message<T> where T: Deserialize<'de>
.
为了实际执行解码,我:
"json"
表单数据的key;尽快脱险。这样做的代码(为方便读者使用显式类型注释):
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) 我使用 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) 我试图将枚举序列化为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) 我试图派生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) 我试图用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)