Rust:将JSON数组反序列化为一个非常简单的自定义表
我正试图用Rust将数组数组(表示字符串单元格表)反序列化为自定义结构。我知道使用Rust:将JSON数组反序列化为一个非常简单的自定义表,rust,serde-json,Rust,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
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);
}
}
使用serde::{反序列化};
使用serde_json::{self,Result};
#[派生(反序列化、调试)]
发布结构行{
发布单元:Vec,
}
#[派生(反序列化、调试)]
pub结构表{
酒吧行:Vec,
}
impl表格{
pub fn new(数据:&str)->结果{
let table=serde_json::from_str(数据);
桌子
}
}
#[cfg(测试)]
模试验{
使用超级::*;
#[测试]
fn from_json_string(){
让测试_table=r#”
[
["0,1", "0,2", "0,3"],
["1,1", "1,2", "1,3"]
]
"#;
let table:table=table::新建(&test_table).unwrap();
assert_eq!(table.rows.len(),2);
}
}
使用此代码时,测试会出现错误(“无效类型:字符串\“0,1\”,预期为结构行”
)
我应该如何为这个简单的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::{反序列化};
使用serde_json::{self,Result};
#[派生(反序列化、调试)]
#[serde(透明)]
发布结构行{
发布单元:Vec,
}
#[派生(反序列化、调试)]
#[serde(透明)]
pub结构表{
酒吧行:Vec,
}
impl表格{
pub fn new(数据:&str)->结果{
let table=serde_json::from_str(数据);
桌子
}
}
#[cfg(测试)]
模试验{
使用超级::*;
#[测试]
fn from_json_string(){
让测试_table=r#”
[
["0,1", "0,2", "0,3"],
["1,1", "1,2", "1,3"]
]
"#;
let table:table=table::新建(&test_table).unwrap();
assert_eq!(table.rows.len(),2);
}
}
#[serde(透明)]
用一个字段序列化和反序列化一个新类型结构或带括号的结构,就像它的一个字段被自己序列化和反序列化一样。类似于#[repr(transparent)]
取自此处的属性页面:您的输入不是有效的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字符串!问题是serde希望找到一个JSON对象反序列化为一个结构,在这种情况下,我希望JSON数组反序列化为一个结构创建。然后我需要使结构“透明”以反序列化到内部向量场。至少这是我理解的。