2015-02-10 37 views
2

previous post我找到了一種方法用的boost ::精神來分析這種類型的結構:解析逗號分隔的語法時無序

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

這是一個與鍵值對一個簡單的JSON。現在我想分析這個結構,而不管可變訂單。即我想解析爲同一對象也是這個結構:

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

我知道我可以使用^運營商爲了以任何順序來分析數據,但我dont't知道如何在線的終端處理逗號但最後。我怎樣才能解析這兩個結構?

這是上一篇文章的@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"; 
} 
+0

,我要爲這些代碼:) – sehe 2015-02-10 21:55:24

+0

概不負責,只有指定誰知道精神,誰不..... – Jepessen 2015-02-10 21:57:08

回答

2

我要指一組最新的答案,我已經過東西相當廣泛的:

切向有關:

+0

我會照常檢查他們。感謝您的支持。 – Jepessen 2015-02-10 22:33:20

+0

我正在使用「C++和BOOST的JSON文件」的樣本,它似乎工作。再次感謝! – Jepessen 2015-02-11 08:34:29