关键词:
【中文标题】使用 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
中将每个元素推送到其特定的Vec
s。
对于第二个,我反序列化为Vec<Vec<i8>>
,然后再次迭代,逐个元素地转换为最终的Struct
。
我通读了所有serde
文档并试图找到示例,但找不到直接推送到Struct
的最终Vec
s 的方法,而无需中间步骤。
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中导出一个函 查看详情