当前位置: 首页 > 知识库问答 >
问题:

从Boost返回多个数据类型::精神解析

欧阳俊晖
2023-03-14

我想解析大约5-10种不同的消息类型,它们共享一种通用格式(例如JSON),但每种类型都有需要验证的特定字段。每条消息最终都应该被解析成一个定制的类/结构,其类型不需要任何类型的转换(例如,一个字段是int而不是variant/tuple)。我认为解决这个问题有两种方法:

>

  • 为每个特定消息编写语法,处理消息格式(本例中为JSON样板)的验证并验证字段的内容,返回真正的自定义结构

    编写一个语法,仅验证结构(仅 JSON 规则)并返回更通用的对象(包含变体/元组等字段),并在更高级别验证/转换为自定义结构(转换和检查各种变体字段)

    我认为这些是每个人的利弊:

    1的优点:

    • 所有验证都在boost::spirit中完成
    • Karma生成器(如果编写的话)看起来像是现有的spirit解析代码

    1的缺点:

    • 对于未来可能出现的每一种新的消息类型,都必须编写和维护新的语法(spirit语法并不直观)

    优点2:

    • 复杂的灵码写一次很少碰

    2的缺点:

      < li >通用消息对象的验证和转换将会是spirit首先应该消除的混乱代码

    哪种方法更可取?有没有第三种方法可以使用一种语法解析为多种类型?

    以下是一些示例消息和它们最终应该驻留的类:

    {"messageType": "messageTypeA", "numberParam": 1}
    {"messageType": "messageTypeB", "stringParam": "Test"}
    
    class MessageTypeA
    {
    public:
        double numberParam;
    };
    
    class MessageTypeB
    {
    public:
        std::string stringParam;
    };
    
  • 共有1个答案

    安高义
    2023-03-14

    我认为这个问题非常接近最近的一个答案,我正是这样做的:我用两个答案回答:

    1. 答案#1采用通才方法,仅根据特定的“方案”进行解释。
    2. 答案#2采取特别方法,OP认为这更容易

    我的投票是第一个选项,因为

    • "编写复杂代码

    即使是链接问题中的OP后来似乎也需要我的第一个答案已经提供的灵活性:

    哦,好吧。我很惊讶你当时接受了这个答案,因为另一个答案完全相同,除了它确实接受并忽略“其他”JSON内容。您是否错过了定义extract_from的更新?它使用完全相同的数据结构 - 您在问题中建议的数据结构。– sehe Jan 4 at 16:41

     类似资料:
    • 问题内容: 如何从AsyncTask中获取数据?我的MainActivity正在调用触发AsyncTask的DataCall.getJSON函数,但是我不确定如何将数据返回到原始Activity。 调用DataCall的MainActivity应该返回一个字符串并将其保存在 数据通话: 问题答案: 对我来说,关键是创建一个名为URLWithParams的类或其他类,因为AsyncTask将只允许发

    • 如标题所述,我正在尝试从int类型的方法()返回多个整数。该方法旨在接受整数数组并确定模式。另一个问题是索引中的每个值的范围为1-3。我无法创建对象、其他方法来处理部分解决方案或导入任何帮助我的东西。 我遇到的问题是如果数组中有多个模式 即 如您所见,在本例中有两种模式,分别是2和3,我不知道如何从一个方法返回多个整数。 这是我教授的指示“ “编写方法int mode(int[]a)。此函数采用一

    • 问题内容: 我想知道以下内容: 如何从数据库中的多个表中获取数据? 有哪些类型的方法可以做到这一点? 什么是联接和工会,它们之间有何不同? 什么时候应该使用每个与其他比较? 我打算在我的应用程序(例如,PHP)中使用此功能,但是不想对数据库运行多个查询,我需要在单个查询中从多个表中获取数据的哪些选项? 注意:我正在写这篇文章是因为我希望能够链接到有关我在PHP队列中不断遇到的众多问题的书面指南,因

    • 为了理解TypeScript的精神,我在我的组件和服务中编写了全类型签名,这扩展到了angular2表单的自定义验证函数。 我知道我可以重载函数签名,但这需要每个返回类型的参数不同,因为将每个签名编译为单独的函数: 我还知道我可以返回单个类型(如Promise),它本身可以是多个子类型: 但是,在angular2自定义表单验证器的上下文中,单个签名(一个类型为的参数)可以返回两种不同的类型:带有表

    • 问题内容: 如何快速从函数返回3个相同类型(Int)的单独数据值? 我试图返回一天中的时间,我需要将小时,分钟和秒作为单独的整数返回,但是所有这些都来自同一个函数,这可能吗? 我想我只是不了解返回多个值的语法。这是我正在使用的代码,我在last(return)行上遇到了麻烦。 任何帮助将不胜感激! 问题答案: 返回一个元组: 然后将其调用为: 要么:

    • 问题内容: 我如何使用类型提示来注释一个返回总是返回两个值的函数:a和a ?提示很接近,除了将返回值类型限制为元组,而不是生成器或其他可迭代类型。 我主要是好奇的,因为我想注释一个用于返回多个值的函数,如下所示: 通常函数喜欢做这样的事情(它返回一个元组),但我喜欢的类型暗示要足够灵活,以取代发电机或列表或别的东西返回的元组。 问题答案: 您总是返回 一个 对象;使用只需返回一个元组。 是的,完全