反序列化 YAML 数据“表”

2024-01-11

我正在使用 yamldotnet 和 c# 来反序列化由第三方软件应用程序创建的文件。以下 YAML 文件示例在应用程序中均有效:

#File1
Groups:
  - Name: ATeam
    FirstName, LastName, Age, Height:
      - [Joe, Soap, 21, 184]
      - [Mary, Ryan, 20, 169]
      - [Alex, Dole, 24, 174]

#File2
Groups:
  - Name: ATeam
    FirstName, LastName, Height:
      - [Joe, Soap, 184]
      - [Mary, Ryan, 169]
      - [Alex, Dole, 174]

请注意,File2 没有任何 Age 列,但解串器仍必须识别出每行的第三个值是高度而不是年龄。该数据应该代表一个人员表。以 File1 为例,Mary Ryan 年龄 20 岁,身高 169 厘米。解串器需要了解它所具有的列(对于 File2,它只有 FirstName、LastName 和 Height)并将数据相应地存储在正确的对象中:Mary Ryan 身高 169 厘米。

同样,程序文档指出列的顺序并不重要,因此下面的 File3 是表示 File2 中数据的同样有效的方法,即使高度现在是第一位的:

#File3
Groups:
 - Name: ATeam
   Height, FirstName, LastName:
      - [184, Joe, Soap]
      - [169, Mary, Ryan]
      - [174, Alex, Dole]

我有很多问题:

  1. 这是标准的 YAML 吗? - 我找不到任何有关使用的信息 同一行上的多个键,后跟冒号和列表 值来表示数据表。
  2. 我将如何使用 yamldotnet 反序列化它?在那儿 我可以做一些修改来帮助它吗?
  3. 如果我无法使用 yamldotnet,我该怎么办?

正如其他答案所述,这是有效的 YAML。但是,文档的结构是特定于应用程序的,并且没有使用 YAML 的任何特殊功能来表达表格。

您可以使用 YamlDotNet 轻松解析此文档。然而你会遇到两个困难。首先,由于列的名称放置在键内,因此您将需要使用一些自定义序列化代码来处理它们。第二个是您需要实现某种抽象才能以表格方式访问数据。

我提出了一个概念证明,它将说明如何解析和读取数据。

首先,创建一个类型来保存 YAML 文档中的信息:

public class Document
{
    public List<Group> Groups { get; set; }
}

public class Group
{
    public string Name { get; set; }

    public IEnumerable<string> ColumnNames { get; set; }

    public IList<IList<object>> Rows { get; set; }
}

然后实施IYamlTypeConverter来解析Group type:

public class GroupYamlConverter : IYamlTypeConverter
{
    private readonly Deserializer deserializer;

    public GroupYamlConverter(Deserializer deserializer)
    {
        this.deserializer = deserializer;
    }

    public bool Accepts(Type type)
    {
        return type == typeof(Group);
    }

    public object ReadYaml(IParser parser, Type type)
    {
        var group = new Group();

        var reader = new EventReader(parser);
        do
        {
            var key = reader.Expect<Scalar>();
            if(key.Value == "Name")
            {
                group.Name = reader.Expect<Scalar>().Value;
            }
            else
            {
                group.ColumnNames = key.Value
                    .Split(',')
                    .Select(n => n.Trim())
                    .ToArray();

                group.Rows = deserializer.Deserialize<IList<IList<object>>>(reader);
            }
        } while(!reader.Accept<MappingEnd>());
        reader.Expect<MappingEnd>();

        return group;
    }

    public void WriteYaml(IEmitter emitter, object value, Type type)
    {
        throw new NotImplementedException("TODO");
    }
}

最后,将转换器注册到反序列化器中并反序列化文档:

var deserializer = new Deserializer();
deserializer.RegisterTypeConverter(new GroupYamlConverter(deserializer));

var document = deserializer.Deserialize<Document>(new StringReader(yaml));

您可以在此处测试完整的工作示例 https://dotnetfiddle.net/wm82ka

这只是一个概念证明,但它应该作为您自己实施的指南。可以改进的地方包括:

  • 检查并处理无效文件。
  • 改善Group班级。也许使它不可变,并添加一个索引器。
  • 实施WriteYaml方法(如果需要序列化支持)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

反序列化 YAML 数据“表” 的相关文章

随机推荐

  • EXCEPTION_ACCESS_VIOLATION (0xc0000005) 来自 JNI 的 JVM?

    我在 vc 中用 JNI 编写了一些本机方法 以便从 java 访问 我的三种方法中有两种工作得很好 没有任何问题 然而 当我在运行时调用我的最后一个方法时 它会导致以下错误消息 A fatal error has been detecte
  • 如何使 GTFS 查询运行得更快?

    我正在尝试使用 GTFS 数据库 即 RATP 为巴黎及其郊区提供的数据库 数据集是huge The stop times表有 1400 万行 这是表架构 https github com mauryquijada gtfs mysql b
  • python 中的范围函数

    for n in range 2 5 for x in range 2 n print n x 输出如下 3 2 4 2 4 3 为什么n的值从3开始而不是从2开始 n三点开始因为range 2 2 是空的 也许你真的想要 for n in
  • iPhone 是否支持传入彩信中的 SMIL?

    在我开发的一项服务中 我向用户发送一条彩信 其中包含 6 个静态顺序的图像 为了正确排序图像并添加格式 我使用了 SMIL 它在多种设备上运行良好 然而 iPhone 似乎根本不识别 SMIL 图像按文件名字母顺序排序 更糟糕的是 它们不是
  • 如何向独立的异步任务添加进度条?

    我有一个处于其自己的活动中的异步任务 我向它传递一个字符串值 它连接到我的 Web 服务并根据我传入的名称下载 Json 数据 返回 Json 结果集 效果很好 我想向异步任务添加一个进度旋转器 但我不知道如何做到这一点 我已经仔细阅读了这
  • 属性检测:使用“in”与尝试访问属性

    不得不提的是 我了解一点 JavaScript 但还不是很深入 始终认为这是检查对象上的属性是否可用的正确方法 if window console doSomething 昨天我看到了使用这种技术的代码 if console in wind
  • 由于属性名称规范化,AngularJS 链接函数未调用

    我已经按照自定义验证下的文档定义了一个验证器https docs angularjs org guide forms https docs angularjs org guide forms 但由于某种原因link函数没有被调用 我可以看出
  • Grails select 将不会返回正确的数据

    这是一个延续this https stackoverflow com questions 6959777 grails chained drop down问题 我有一个Address包含基本街道地址信息的类 我也有一个User具有属性的类p
  • 复制 SQL 表中的 3B 行?

    我必须复制一个表 该表在同一数据库中有大约 3B 行 没有 TEXT NTEXT 或其他 LOB 列 最大限度减少停机时间的最快方法是什么 我尝试过 bcp 导入 导出和 SELECT INTO 我收集了每个项目的时间统计数据 它至少需要
  • Rails 请求伪造保护设置

    请帮助 Rails 新手 我有protect from forgery调用 默认情况下给出 我的中没有属性ApplicationController class 基本上这是代码 class ApplicationController lt
  • 如何用vue js绑定组件?

    我有表单和选择组件 事实上事情很简单 我需要两个绑定模型 父组件 Vue component some form template some form data function return countryNameParent 带有项目的
  • 了解 WebRTC 中的 SFU、TURN 服务器

    如果我正在构建 WebRTC 应用程序并使用选择性转发单元媒体服务器 这是否意味着我不需要 STUN TURN 服务器 据我了解 STUN 服务器用于客户端发现其公共 IP 端口 而 TURN 服务器用于当客户端无法通过 STUN 直接相互
  • 将值数组插入 SQL Server 中表的列中

    我有一个数组 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 我想将这个值数组插入到表中 例如 Column1 Column2 Column3 Column4 1 2 3 4 5 6 7 8 9 10 11 1
  • 如何在 Windows 中的特定显示器上打开窗口?

    我的任务是修改我们的一款 C 产品 以便在 Windows 操作系统的特定显示器上生成一个新窗口 这适用于需要能够配置平铺多显示器可视化的客户 其中每个显示器由单台计算机上的单独显卡驱动 在 Linux 中 我可以通过在每个显示器上启动 X
  • Vue DOM 对计算属性没有反应

    我有一个按钮 如果计算属性的有效属性为 false 则该按钮设置为禁用 如果为 true 则应启用该按钮并允许用户移至当前流程中的下一步 我的 currentStep 计算属性正在根据当前步骤输入的更改完美更新 但按钮 disabled c
  • 摘自 Django 1.5 中的 QueryDict/json

    From self request body I have changes 5B0 5D 5B 5D 1 changes 5B0 5D 5B 5D query changes 5B0 5D 5B 5D first changes 5B0 5
  • 如何使用 spring-data-elasticsearch 在 elasticsearch 中进行集成测试?

    我正在使用 spring data elasticsearch v3 2 4 RELEASE 它可以通过 spring boot starter data elasticsearch v2 2 4 RELEASE 获得 我想为此进行集成测试
  • SQLAlchemy 按字段唯一约束

    我在现场有 UniqueConstraint 但它不允许我添加多个条目 最多两个 from sqlalchemy import Column Integer String Boolean UniqueConstraint class Car
  • ANTLR 4 令牌规则匹配任何字符,直到遇到 XYZ

    我想要一个标记规则 它会吞噬所有字符 直到它到达字符XYZ 因此 如果输入是这样的 helloXYZ 那么令牌规则应该返回这个令牌 hello 如果输入是这样的 Blah Blah XYZ 那么令牌规则应该返回这个令牌 Blah Blah
  • 反序列化 YAML 数据“表”

    我正在使用 yamldotnet 和 c 来反序列化由第三方软件应用程序创建的文件 以下 YAML 文件示例在应用程序中均有效 File1 Groups Name ATeam FirstName LastName Age Height Jo