Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rust:将JSON数组反序列化为一个非常简单的自定义表_Rust_Serde Json - Fatal编程技术网

Rust:将JSON数组反序列化为一个非常简单的自定义表

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

我正试图用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);
    }

}
使用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数组反序列化为一个结构创建。然后我需要使结构“透明”以反序列化到内部向量场。至少这是我理解的。