首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从Boost::灵性解析返回多个数据类型

从Boost::灵性解析返回多个数据类型
EN

Stack Overflow用户
提问于 2015-02-24 23:37:03
回答 1查看 238关注 0票数 1

我想解析大约5-10种不同的消息类型,它们共享公共格式(例如JSON ),但是每个消息类型都有需要验证的特定字段。每个消息最终应该被解析成一个自定义的类/结构,其类型不需要任何类型的转换(例如,字段是int而不是变量/元组)。我看到了解决这个问题的两种方法:

  1. 为处理这两种消息格式的验证的每个特定消息编写一个语法(在本例中,JSON样板)并验证字段的内容,返回真正的自定义结构
  2. 编写一个语法,它只验证结构(只有JSON规则),并返回一个更通用的对象(包含变体/元组等字段)。并在更高级别验证/转换为自定义结构(转换和检查各种变体字段)

我认为这两种方法各有优缺点:

1名专业人员:

  • 所有验证都是在boost::spirit中完成的。
  • Karma生成器(如果编写的话)将类似于现有的精神解析代码。

1的缺点:

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

赞成2:

  • 复杂的精神代码只编写一次,很少被触及。

2的缺点:

  • 一般消息对象的验证和转换将是混乱的代码,精神应该首先消除这些代码。

哪种方法更好?是否有第三种方法使用一种语法将其解析为多个类型?

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

代码语言:javascript
复制
{"messageType": "messageTypeA", "numberParam": 1}
{"messageType": "messageTypeB", "stringParam": "Test"}

class MessageTypeA
{
public:
    double numberParam;
};

class MessageTypeB
{
public:
    std::string stringParam;
};
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-02-25 02:52:01

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

  1. Answer #1采用通才的方法,只是根据一个特定的“方案”进行解释。
  2. Answer #2采用了临时的方法,这被OP认为更容易一些。

我投票赞成第一种选择,因为

  • “复杂的代码只编写一次和测试一次,很少接触到”,
  • 事实上,语法从分离的职责和保持AST非常接近自然规则属性中受益匪浅。
  • 我已经编写了多个JSON后端的“味道”(OData、Edm、版本、元数据级别)到我的融合适应类型(使用融合“反射”)。它们都共享同一个解析器/生成器。

即使是相关问题中的任择议定书,似乎也需要我的第一个答案所提供的灵活性:

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28708501

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档