gpt4 book ai didi

json - 有没有更好的方法将 Rust BSON 文档直接转换为 JSON?

转载 作者:行者123 更新时间:2023-12-05 07:31:01 25 4
gpt4 key购买 nike

想法是从 Mongo 获取游标并将结果集序列化为字符串中的 JSON。我有工作代码:

extern crate bson;
extern crate mongodb;

use mongodb::db::ThreadedDatabase;
use mongodb::{Client, ThreadedClient};

extern crate serde;
extern crate serde_json;

fn main() {
let client =
Client::connect("localhost", 27017).expect("Failed to initialize standalone client.");

let coll = client.db("foo").collection("bar");

let cursor = coll.find(None, None).ok().expect("Failed to execute find.");

let docs: Vec<_> = cursor.map(|doc| doc.unwrap()).collect();

let serialized = serde_json::to_string(&docs).unwrap();

println!("{}", serialized);
}

有更好的方法吗?如果没有,我将关闭此线程。

最佳答案

这就是serde-transcode是为了。它的作用是直接在 serde 格式之间进行转换。它是如何工作的,它接收一个Deserializer和一个Serializer,然后直接为每个反序列化的项目调用相应的序列化函数。从概念上讲,这有点类似于使用 serde_json::Value 作为中间格式,但如果在输入格式中可用,它可能包含一些额外的类型信息。

不幸的是,bson crate 没有公开bson::de::raw::Deserializerbson::ser::raw: :Serializer 所以这目前是不可能的。 如果您查看文档,DeserializerSerializer 实际上指的是处理与 Bson 枚举之间的转换。

如果 bson::de::raw::Deserializer 是公开的,那么这段代码会产生预期的效果。希望这对任何有类似问题的人(或任何想要这个足以在他们的 repository 上提出问题的人)有所帮助。

let mut buffer = Vec::new();

// Manually add array separators because the proper way requires going through
// DeserializeSeed and that is a whole other topic.
buffer.push(b'[');

while cursor.advance().await? {
let bytes = cursor.current().as_bytes();

// Create deserializer and serializer
let deserializer = bson::de::raw::Deserializer::new(bytes, false);
let serializer = serde_json::Serializer::new(&mut buffer);

// Transcode between formats
serde_transcode::transcode(deserializer, serializer).unwrap();

// Manually add array separator
buffer.push(b',');
}

// Remove trailing comma and add closing bracket
if buffer.len() > 1 {
buffer.pop();
}
buffer.push(']');

// Do something with the result
println!("{}", String::from_utf8(buffer).unwrap())

关于json - 有没有更好的方法将 Rust BSON 文档直接转换为 JSON?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51982893/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com