Rust:将一个 JSON 数组反序列化为一个非常简单的自定义 table
Rust: Deserialize a JSON array into a very simple custom table
我正在尝试使用 serde_json 将数组数组(表示 table 字符串单元格)反序列化为 Rust 中的自定义结构。我知道使用 serde_json::Value
对于这个简单的案例就足够了,但我想构建一个自定义类型。
use serde::{Deserialize};
use serde_json::{self, Result};
#[derive(Deserialize, Debug)]
pub struct Row {
pub cells: Vec<String>,
}
#[derive(Deserialize, Debug)]
pub struct Table {
pub rows: Vec<Row>,
}
impl Table {
pub fn new(data: &str) -> Result<Table> {
let table = serde_json::from_str(data);
table
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn from_json_string() {
let test_table = r#"
[
["0,1", "0,2", "0,3"],
["1,1", "1,2", "1,3"]
]
"#;
let table: Table = Table::new(&test_table).unwrap();
assert_eq!(table.rows.len(), 2);
}
}
使用此代码,测试会出现 Error("invalid type: string \"0,1\", expected struct Row"
恐慌。
我应该如何为这个简单的 JSON 字符串定义结构?
您想将标签 #[serde(transparent)]
添加到结构
use serde::{Deserialize};
use serde_json::{self, Result};
#[derive(Deserialize, Debug)]
#[serde(transparent)]
pub struct Row {
pub cells: Vec<String>,
}
#[derive(Deserialize, Debug)]
#[serde(transparent)]
pub struct Table {
pub rows: Vec<Row>,
}
impl Table {
pub fn new(data: &str) -> Result<Table> {
let table = serde_json::from_str(data);
table
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn from_json_string() {
let test_table = r#"
[
["0,1", "0,2", "0,3"],
["1,1", "1,2", "1,3"]
]
"#;
let table: Table = Table::new(&test_table).unwrap();
assert_eq!(table.rows.len(), 2);
}
}
#[serde(transparent)]
Serialize and deserialize a newtype struct or a braced struct with one field exactly the same as if its one field were serialized and deserialized by itself. Analogous to #[repr(transparent)].
取自此处的属性页面:https://serde.rs/container-attrs.html
您的输入无效 JSON,并且由于您使用的是 serde_json
,因此输入实际上是 JSON.
是明智的
您可以将代码更改为类似于以下代码的内容:
#[test]
fn from_json_string() {
let test_table = r#"
{
"rows" : [
{
"cells" : ["1", "2"]
},
{
"cells" : ["3", "4"]
}
]
}"#;
let table: Table = Table::new(&test_table).unwrap();
assert_eq!(table.rows.len(), 2);
}
我正在尝试使用 serde_json 将数组数组(表示 table 字符串单元格)反序列化为 Rust 中的自定义结构。我知道使用 serde_json::Value
对于这个简单的案例就足够了,但我想构建一个自定义类型。
use serde::{Deserialize};
use serde_json::{self, Result};
#[derive(Deserialize, Debug)]
pub struct Row {
pub cells: Vec<String>,
}
#[derive(Deserialize, Debug)]
pub struct Table {
pub rows: Vec<Row>,
}
impl Table {
pub fn new(data: &str) -> Result<Table> {
let table = serde_json::from_str(data);
table
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn from_json_string() {
let test_table = r#"
[
["0,1", "0,2", "0,3"],
["1,1", "1,2", "1,3"]
]
"#;
let table: Table = Table::new(&test_table).unwrap();
assert_eq!(table.rows.len(), 2);
}
}
使用此代码,测试会出现 Error("invalid type: string \"0,1\", expected struct Row"
恐慌。
我应该如何为这个简单的 JSON 字符串定义结构?
您想将标签 #[serde(transparent)]
添加到结构
use serde::{Deserialize};
use serde_json::{self, Result};
#[derive(Deserialize, Debug)]
#[serde(transparent)]
pub struct Row {
pub cells: Vec<String>,
}
#[derive(Deserialize, Debug)]
#[serde(transparent)]
pub struct Table {
pub rows: Vec<Row>,
}
impl Table {
pub fn new(data: &str) -> Result<Table> {
let table = serde_json::from_str(data);
table
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn from_json_string() {
let test_table = r#"
[
["0,1", "0,2", "0,3"],
["1,1", "1,2", "1,3"]
]
"#;
let table: Table = Table::new(&test_table).unwrap();
assert_eq!(table.rows.len(), 2);
}
}
#[serde(transparent)]
Serialize and deserialize a newtype struct or a braced struct with one field exactly the same as if its one field were serialized and deserialized by itself. Analogous to #[repr(transparent)].
取自此处的属性页面:https://serde.rs/container-attrs.html
您的输入无效 JSON,并且由于您使用的是 serde_json
,因此输入实际上是 JSON.
您可以将代码更改为类似于以下代码的内容:
#[test]
fn from_json_string() {
let test_table = r#"
{
"rows" : [
{
"cells" : ["1", "2"]
},
{
"cells" : ["3", "4"]
}
]
}"#;
let table: Table = Table::new(&test_table).unwrap();
assert_eq!(table.rows.len(), 2);
}