[英]Rust: Deserialize a JSON array into a very simple custom table
我正在尝试使用serde_json将一组数组(表示字符串单元格表)反序列化为 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)]
序列化和反序列化具有一个字段的 newtype 结构或花括号结构,就好像它的一个字段由其自身序列化和反序列化一样。 类似于#[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);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.