rust - 使用 serde 序列化嵌套的对象数组
问题描述
从描述拼图网格的结构中,我希望能够序列化嵌套数组:
struct Grid {
display: String,
solution: String,
width: usize,
height: usize,
}
假设 struct Grid { display: "????", solution: "1234", width: 2, height: 2 }
,我希望输出如下所示(在 JSON 中):
[
[
{
"display": "?",
"solution": "1"
},
{
"display": "?",
"solution": "2"
}
],
[
{
"display": "?",
"solution": "3"
},
{
"display": "?",
"solution": "4"
}
]
]
我的初始实施草案如下所示:
impl<'a> Serialize for Grid<'a> {
fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
let mut columns = serializer.serialize_seq(Some(self.height))?;
for column_index in 0..self.height {
let mut column = columns.serialize_seq(Some(self.width))?;
for row_index in 0..self.width {
let mut cell = column.serialize_map(Some(2))?;
let cell_index = column_index * self.height + row_index;
cell.serialize_entry("display", self.display.chars().nth(cell_index).unwrap())?;
cell.serialize_entry("solution", self.solution.chars().nth(cell_index).unwrap())?;
cell.end()?;
}
column.end()?;
}
columns.end()
}
}
但是,SerializeSeq
没有公开另serialize_seq
一种进一步嵌套的方法。如何从这样的一个结构中序列化嵌套数组?
解决方案
您需要几个辅助结构来表示一行和一个单元格:
use serde::*; // 1.0.130
use serde::ser::*;
struct Grid {
display: String,
solution: String,
width: usize,
height: usize,
}
impl Serialize for Grid {
fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
let mut rows = serializer.serialize_seq (Some (self.height))?;
for idx in 0..self.height {
rows.serialize_element (&Row { grid: self, start_idx: idx * self.width })?;
}
rows.end()
}
}
struct Row<'a> {
grid: &'a Grid,
start_idx: usize,
}
impl<'a> Serialize for Row<'a> {
fn serialize<S: Serializer> (&self, serializer: S) -> Result<S::Ok, S::Error> {
let mut row = serializer.serialize_seq (Some (self.grid.width))?;
for idx in 0..self.grid.width {
row.serialize_element (&Cell { grid: self.grid, idx: self.start_idx + idx })?;
}
row.end()
}
}
struct Cell<'a> {
grid: &'a Grid,
idx: usize,
}
impl<'a> Serialize for Cell<'a> {
fn serialize<S: Serializer> (&self, serializer: S) -> Result<S::Ok, S::Error> {
let mut cell = serializer.serialize_map (Some (2))?;
cell.serialize_entry ("display", &self.grid.display.chars().nth (self.idx).unwrap())?;
cell.serialize_entry ("solution", &self.grid.solution.chars().nth (self.idx).unwrap())?;
cell.end()
}
}
推荐阅读
- php - 使用 IF 子句插入 PDO
- goaccess - 如何使用 Goaccess 来衡量访问量?
- nestjs - NestJS 更新后 AuthGuard 损坏
- security - 如何防止用户在 GCP 中下载数据(所有可能的方法)
- html - 我不断收到此服务器错误 - 错误:默认导出不是页面中的 React 组件:“/products/all”
- terraform - 如何阻止 Terraform 被滥用
- angular - 从页面导航后离子栏消失
- php - 在 WooCOMmerce 中将值从自定义字段转移到属性
- c - 如何释放字符串 (C)?
- nuxt.js - 如何避免 Vuetify 导航抽屉总是选择索引路由为活动状态