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

无序时解析逗号分隔的语法

尉迟高澹
2023-03-14

从以前的帖子中,我找到了一种方法来解析这种类型::结构:

"parameter" : {
  "name"        : "MyName"       , 
  "type"        : "MyType"       , 
  "unit"        : "MyUnit"       , 
  "cardinality" : "MyCardinality", 
  "value"       : "MyValue"       
}

这是一个具有键值对的简单 JSON。现在我想解析这个结构,而不管变量顺序如何。即,我想解析到同一个对象中,也是这个结构:

"parameter" : {
  "type"        : "MyType"       ,
  "value"       : "MyValue"      ,
  "unit"        : "MyUnit"       , 
  "cardinality" : "MyCardinality",
  "name"        : "MyName"
}

我知道我可以使用^操作符来以任何顺序解析数据,但是我不知道如何处理行尾的逗号。我如何解析这两种结构?

这是上一篇文章中@sehe代码。语法在这里定义。

#define BOOST_SPIRIT_DEBUG
#include <boost/fusion/include/io.hpp>
#include <boost/spirit/include/qi.hpp>
#include <boost/fusion/include/adapt_struct.hpp>

// This is pasted and copied from another header file

namespace StateMachine {
namespace Private {

    struct LuaParameterData {
        std::wstring name;
        std::wstring type;
        std::wstring unit;
        std::wstring cardinality;
        std::wstring value;
    };

} // namespace Private
} // namespace StateMachine

BOOST_FUSION_ADAPT_STRUCT(
  StateMachine::Private::LuaParameterData,
  (std::wstring, name)
  (std::wstring, type)
  (std::wstring, unit)
  (std::wstring, cardinality)
  (std::wstring, value)
)

namespace qi = boost::spirit::qi;

// From here original file continues
namespace StateMachine {
namespace Private {

    template<typename Iterator>
    struct LuaParameterDataParser : qi::grammar<Iterator, LuaParameterData(), qi::ascii::space_type>
    {
        LuaParameterDataParser() : LuaParameterDataParser::base_type(start)
        {
            quotedString = qi::lexeme['"' >> +(qi::ascii::char_ - '"') >> '"'];

            start =
                qi::lit("\"parameter\"")
                >> ':'
                >> '{'
                >> qi::lit("\"name\""       ) >> ':' >> quotedString >> ','
                >> qi::lit("\"type\""       ) >> ':' >> quotedString >> ','
                >> qi::lit("\"unit\""       ) >> ':' >> quotedString >> ','
                >> qi::lit("\"cardinality\"") >> ':' >> quotedString >> ','
                >> qi::lit("\"value\""      ) >> ':' >> quotedString
                >> '}'
                ;

            BOOST_SPIRIT_DEBUG_NODES((start)(quotedString));
        }

        qi::rule<Iterator, std::string(), qi::ascii::space_type> quotedString;
        qi::rule<Iterator, LuaParameterData(), qi::ascii::space_type> start;
    };

} // namespace Private
} // namespace StateMachine

int main() {
    using It = std::string::const_iterator;

    std::string const input = R"(
        "parameter" : {
            "name"        : "name"       , 
            "type"        : "type"       , 
            "unit"        : "unit"       , 
            "cardinality" : "cardinality", 
            "value"       : "value"       
        }
    )";
    It f = input.begin(), 
       l = input.end();

    StateMachine::Private::LuaParameterDataParser<It> p;
    StateMachine::Private::LuaParameterData data;
    bool ok = qi::phrase_parse(f, l, p, qi::ascii::space, data);

    if (ok) {
        std::wcout << L"Parsed: \n";
        std::wcout << L"\tname: " << data.name << L'\n';
        std::wcout << L"\ttype: " << data.type << L'\n';
        std::wcout << L"\tunit: " << data.unit << L'\n';
        std::wcout << L"\tcardinality: " << data.cardinality << L'\n';
        std::wcout << L"\tvalue: " << data.value << L'\n';
    } else {
        std::wcout << L"Parse failure\n";
    }

    if (f!=l)
        std::wcout << L"Remaining unparsed: '" << std::wstring(f,l) << L"'\n";
}

共有1个答案

柯良骏
2023-03-14

我将参考一组最近的回答,我已经对这些问题进行了广泛的讨论:

>

  • 使用Boost::精神解析异构数据
  • ad-hoc类JSON解析使用C和BOOST读取JSON文件

    应用更通用的JSON语法:使用C和BOOST读取JSON文件

    切向相关:

    >

  • 提升精神:类似于排列,但不完全是

    http://boost-spirit . com/home/2011/04/16/the-keyword-parser/

  •  类似资料:
    • 问题内容: 我有一些特殊字符的字符串。目的是检索每行的String [](分隔)。您可以使用特殊字符“,在其中可以使用/ n和, 您会看到“ /”中有您/ n。 任何可以帮助我解析此。 谢谢 __更多说明 与主刺我需要分开这些 问题是:对于Julie,KameL,Titi ,在KameL和Titi之间存在换行符/ n,或者在Time,tomy,tony,tini之间存在类似的换行问题,或者 在to

    • 问题内容: 如何在Python中将字符串(一百万)解析为整数? 问题答案: a = ‘1,000,000’ >>> int(a.replace(‘,’, ‘’)) 1000000 >>>

    • 问题内容: 我正在编写导出功能,我需要将联系人导出到Excel,并且遇到了技术难题-也许我的SQL技能的差距更接近事实了。;) 这是场景:我在数据库中有一堆联系人。每个联系人可以具有许多不同的角色,例如,一个联系人可以是C#开发人员和DBA,也可以是DBA和IT经理。它们分为三个表,如下所示: 不太难遵循。有一组联系人和一组角色。这些由相应ID上的ContactRole表连接。 导出联系人时,我需

    • 问题内容: 我有一个非常基本的场景(Angular有点新)。我正在尝试转换JSON: 至: 但我不知道如何生成单个“ p”。您怎么称呼ng-repeat 问题答案: 有用的一件事是创建一个“地图”过滤器,如下所示: 这是映射到命名属性的简单情况,您可以使其更加花哨并理解点表示法等。现在,在您的视图中,您可以执行以下操作: 因为地图过滤器返回一个Array,该数组在Javascript中已经具有内置

    • 问题内容: 我有一个像 我想把它分成那些字符串 如果我简单地打电话给我,那么在修剪之后我会得到不同的结果,因为在某些字符串中,例如,仍然有一个逗号。但我不想放在方括号中。有解决这个问题的优雅方法吗? 问题答案: 假设和没有嵌套和未转义。您可以使用以下方式进行拆分: 正则演示 如果逗号后面没有非圆括号和,则将匹配逗号,从而忽略和中的逗号。

    • 我试图验证数字1-8的逗号分隔列表。