json - 如何在循环中将结构序列化为 io::Write

标签 json rust stream streaming serde

我需要像这样在 Rust 中进行简单的读取/处理/写入:

#[derive(serde::Deserialize)]
struct Incoming {
    first: String,
    last: String,
}

#[derive(serde::Serialize)]
struct Outgoing {
    name: String,
}

// Keep the read/write traits as generic as possible
fn stream_things<R: std::io::Read, W: std::io::Write>(reader: R, writer: W) {
    let incoming: Vec<Incoming> = serde_json::from_reader(reader).unwrap();

    for a in incoming {
        let b = Outgoing {
            name: format!("{} {}", a.first, a.last),
        };
        serde_json::to_writer(writer, &b).unwrap();
    }
}

fn main() {
    stream_things(std::io::stdin(), std::io::stdout());
}

这不会编译,因为:

error[E0382]: use of moved value: `writer`
  --> src/main.rs:20:31
   |
13 | fn stream_things<R: std::io::Read, W: std::io::Write>(reader: R, writer: W) {
   |                                    --                            ------ move occurs because `writer` has type `W`, which does not implement the `Copy` trait
   |                                    |
   |                                    help: consider further restricting this bound: `W: Copy +`
...
20 |         serde_json::to_writer(writer, &b).unwrap();
   |                               ^^^^^^ value moved here, in previous iteration of loop

在循环中写入 std::io::Write 的正确方法是什么? 另外如何使用 serde 的 to_writer 正确执行此操作?

请参阅plaground .

最佳答案

给定Wio::Write ,然后 &mut W 也是io::Write :

impl<'_, W: Write + ?Sized> Write for &'_ mut W

因此编译如下:

fn stream_things<R: std::io::Read, W: std::io::Write>(reader: R, mut writer: W) {
    let incoming: Vec<Incoming> = serde_json::from_reader(reader).unwrap();

    for a in incoming {
        let b = Outgoing {
            name: format!("{} {}", a.first, a.last),
        };
        serde_json::to_writer(&mut writer, &b).unwrap();
    }
}

关于json - 如何在循环中将结构序列化为 io::Write,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60111338/

相关文章:

oop - 为什么 Rust 不支持特征对象向上转换?

node.js - JSONStream 期间的无限循环

ruby-on-rails - 在 Ubuntu 上使用 ruby​​ 2.4.0 安装 json 1.8.3 时出错

javascript - 在 Firebase 的不同节点中写入多个对象

jQuery 如何将一些 json 记录加载到表单字段中?

javascript - 带有 JSON 数组的 jQuery 'each' 循环

types - 根据系统切换数据类型?

rust - 如何在 Diesel 中针对 Postgres 数据库执行带有子查询的删除?

javascript - Node.js Readline 未写入输出文件

c# - 如何在 C# Stream 和 Python 脚本之间重复传递输入和输出?