[英]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.