使用 serde Rust 将数据从记录转置到没有中间结构的列

     2023-02-18     55

关键词:

【中文标题】使用 serde Rust 将数据从记录转置到没有中间结构的列【英文标题】:Transpose data from records to columns without intermediate struct using serde Rust 【发布时间】:2021-11-12 18:32:52 【问题描述】:

我有两种不同的数据结构:

1:JSON


    "key1": 40,
    "key2": 50
,

    "key1": 41,
    "key2": 51

2:嵌套数组

[[40,50],[41,51]]

我们的目标是将这些数据(我以Strings 接收)反序列化为如下所示的结构:

struct data 
    key1: Vec<i8>,      // -> [40,41]
    key2: Vec<i8>       // -> [50,51]

我已经有两种方法来反序列化每种类型的数据,但问题是对于第一种方法,我必须创建一个中间 Struct 并将它们收集到 Vec 中,然后迭代这个 Vec在最终的Struct 中将每个元素推送到其特定的Vecs。 对于第二个,我反序列化为Vec&lt;Vec&lt;i8&gt;&gt;,然后再次迭代,逐个元素地转换为最终的Struct

我通读了所有serde 文档并试图找到示例,但找不到直接推送到Struct 的最终Vecs 的方法,而无需中间步骤。 serde 支持这个吗?如果有,它是如何实现的?

【问题讨论】:

【参考方案1】:

为此,您需要为您的数组提供一个自定义访问者。下面是一个有效的实现。

请注意,虽然我们使用了额外的枚举InnerData,但它不需要任何额外的分配,因为这个结构只在堆栈中使用。对于外部数组 InnerData 的每个元素都将被反序列化,并将其字段推送到 Data 结构的字段。

#[serde(untagged)] 允许从平面变体中反序列化枚举(无需在 json 中指定 Map 或 Array)。

也不是,要使用这种类型的反序列化,您需要专门让Deserializer 知道要使用哪个Visitor。如果您的结构是另一个结构的字段之一,您可以使用#[serde(deserialize_with = ...)] 属性指定它。

use serde::de;
use serde::de::Deserializer;
use serde::Deserialize;

const A: &str = "[\"key1\": 40, \"key2\": 50, \"key1\": 41, \"key2\": 51]";
const B: &str = "[[40, 50], [41, 51]]";

#[derive(Debug, Deserialize)]
struct Data 
    key1: Vec<i8>,
    key2: Vec<i8>,


#[derive(Debug, Deserialize)]
#[serde(untagged)]
enum InnerData 
    Map  key1: i8, key2: i8 ,
    Array(i8, i8),


struct DataVisitor;

impl<'de> de::Visitor<'de> for DataVisitor 
    type Value = Data;

    fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result 
        write!(formatter, "invalid input")
    

    fn visit_seq<A: de::SeqAccess<'de>>(self, mut seq: A) -> Result<Self::Value, A::Error> 
        let mut result = Data 
            key1: vec![],
            key2: vec![],
        ;
        while let Some(inner) = seq.next_element::<InnerData>()? 
            let (k1, k2) = match inner 
                InnerData::Map  key1, key2  => (key1, key2),
                InnerData::Array(key1, key2) => (key1, key2),
            ;

            result.key1.push(k1);
            result.key2.push(k2);
        

        Ok(result)
    


fn main() 
    let mut deserializer = serde_json::Deserializer::from_str(A);
    println!(":?", deserializer.deserialize_seq(DataVisitor ));

    let mut deserializer = serde_json::Deserializer::from_str(B);
    println!(":?", deserializer.deserialize_seq(DataVisitor ));

小提琴:https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=f921adbb490970eb9a8b5ef5f9ab49d0

【讨论】:

也许你可以解释一下这些反序列化器会做什么,如何使用它们,或者更好的是提供代码来说明要做什么。 Maxim,你能添加一段代码来演示一下吗? @mbfernan 我对反序列化器实际上是错误的。在摆弄了一下之后,我得出了可行的解决方案。我改了答案,也给代码加了一些解释。

如何从列转置到行?

】如何从列转置到行?【英文标题】:Howtotransposefromcolumntorows?【发布时间】:2016-05-2411:50:44【问题描述】:我有一张桌子:abc<br>123a,b,c是整数。如何将行转置为两列:<tablestyle="width:100%"><tr><td>col1</td><td&g... 查看详情

rust使用json(代码片段)

JSON作为使用最广泛的数据结构,学习了解如何在发展最快的Rust语言中使用很有必要。本文中我们将学习到:读取无类型的JSON。将JSON读取为强类型数据结构。写JSON字符串。使用 serde 和 serde-json Rust依赖。无类型JSO... 查看详情

将 pdf 地图中的坐标转置到卫星栅格图像上

...一个屏幕截图,将其保存为tiff并将其导入为Rraster对象。使用click,我已经勾勒出了我现在可以绘制到光栅对象上的边界。多边形数据帧 查看详情

SQL 将多行转置到不同的列

...【发布时间】:2021-10-1511:43:03【问题描述】:我有SQLserver数据表,像这样:IDSYMPTOM1SYMPTOM21AB1CD2EF3AC3DE我想得到这个:IDSYMPTOM1SYMPTOM2SYMPTOM3SYMPTOM41ABCD2EF3ACDE这应该是一个“简单”的支点,但我想不通 查看详情

如何将每个第 n 个单元格水平转置到另一个工作表上

...置和引用的组合我似乎无法弄清楚。在Sheet2上,我有以下数据,这是原始参考源。在我的示例中,数据是每8个单元格D4:22L4:16T4:10然后我想在Sheet1上引用Sheet 查看详情

Rust 和 Serde JSON 反序列化示例?

...】:2015-10-2105:51:43【问题描述】:我正在尝试弄清楚如何使用Serde将JSON反序列化为结构。例如,serde_json的owndocumentation上的示例JSON包含以下数据:"FirstName":"John","LastName":"Doe","Age": 查看详情

使用 SORT 进行大型机 JCL 记录转置

】使用SORT进行大型机JCL记录转置【英文标题】:MainframesJCLRecordtransposingusingSORT【发布时间】:2015-07-2914:14:01【问题描述】:我想使用SORT(snycsort或DFSORT)将记录转置到列中。它应该可以扩展到任意数量的记录。这可能吗?DE001XYX... 查看详情

将 SQL 行标题转置到第一列

】将SQL行标题转置到第一列【英文标题】:TransposeSQLrowheaderstofirstcolumn【发布时间】:2018-11-1321:50:32【问题描述】:转置以下查询结果的最短、最快、最简单的方法是什么?我希望0-3和3-6显示在第一列中。对不起,但如果我不伸... 查看详情

将具有唯一值的列转置到行的 SQL 查询

】将具有唯一值的列转置到行的SQL查询【英文标题】:SQLQUERYTOTRANSPOSECOLUMNWITHUNIQUEVALUESTOROWS【发布时间】:2019-12-0915:20:23【问题描述】:我对SQL编程很陌生,因此发现很难满足下面给出的这个要求BARCODEMATERIALSETWEIGHT112345PBR134112345P... 查看详情

Pandas 在行上设置多索引,然后转置到列

...间】:2016-12-2304:07:29【问题描述】:如果我有一个简单的数据框:print(a)onetwothree0A1a1A2b2B1c3B2d4C1e5C2f我可以通过发出以下命令轻松地在行上创建多索引:a.set_index([\'one\',\'tw 查看详情

Serde rust 解析字符串或结构或结构列表

...【发布时间】:2022-01-1112:50:52【问题描述】:我正在尝试使用serde解析以下JSON格式"threads":["md":["type":"PARAGRAPH","value":["type":"PLAIN_TEXT","value":"Plaintextmsg","type" 查看详情

无法从引发 serde 异常的 spark 将数据帧保存为配置单元表

】无法从引发serde异常的spark将数据帧保存为配置单元表【英文标题】:Unabletosavedataframeashivetablefromsparkwhichisthrowingserdeexception【发布时间】:2016-01-0408:33:42【问题描述】:我已在数据框中加载我的一个表并尝试将其保存为配置单... 查看详情

hiverowformats和serde

参考技术ASerde是Serializer/Deserializer的简写。hive使用Serde进行行对象的序列与反序列化。序列化是对象转换为字节序列的过程。序列化是字节序列恢复为对象的过程。对象的序列化主要有两种用途:对象的持久化,即把对象转换成... 查看详情

我如何懒惰地从rust中的文件/流中读取多个json值?(代码片段)

..._json::from_reader(...)只读到文件结尾;似乎没有任何方法可以使用它来读取单个对象或懒惰地迭代对象。有没有办法做到这一点?使用serde_json将是理想的,但如果有一个不同的库我会愿意使用它。目前我将每个对象放在一个单独的... 查看详情

使用 JSON-SERDE 将 JSON 数据摄取到 Hive

】使用JSON-SERDE将JSON数据摄取到Hive【英文标题】:IngestingJSONdataintoHiveusingJSON-SERDE【发布时间】:2018-08-0323:48:16【问题描述】:我正在尝试使用JSON-SERDE将以下JSON数据摄取到Hive中,但出现错误。首先-这个JSON数据有效吗?如果是,... 查看详情

将列中的大量地址(10000)信息列表转置到 csv 中,然后在 mysql 中上传

】将列中的大量地址(10000)信息列表转置到csv中,然后在mysql中上传【英文标题】:Transposinglargelistofaddress(10000)informationincolumnsandlaterincsvtouploadinmysql【发布时间】:2016-11-2514:45:28【问题描述】:我在Excel/LibreOfficeCalc/Word/LibreOffice... 查看详情

错误:必须在此上下文(rust)/serde_json值中知道此值的类型(代码片段)

我正在使用serde_json来反序列化一个json文档。我有一个函数给出一个字符串(这是json文档),将返回一个serde_json值(这是一个表示json类型的枚举),返回一个Option。该值根据需要传递给其他函数。然而,我意识到传递一个Value... 查看详情

是否可以从将引用作为参数的 rust dll 导出函数

...07-0418:52:53【问题描述】:我是学习rust的新手,我看到rust使用通用生命周期在编译时验证引用,这非常好。我没有深入研究如何在rust中构建dll或共享库,但据我所知,可以从dll中导出一个函 查看详情