这是一个小例子,说明如何将boost::spirit::qi用于此类目的。
请注意,Boost确实是第三方库!
假设您收到一个 JSON 文件并将其保存在json-example.txt中,内容如下:
{
"结果":"1",
"gs":"0",
“嘎”:“0”,
“拉”:“0”,
“磅”:“0”,
"lc":"0",
“ld”:“0”,
“前”:“0”,
“gd”:“0”
}
现在,假设您想以key:file方式接收所有项目。你可以这样做:
#include <vector>
#include <string>
#include <fstream>
#include <map>
#include <boost/spirit/include/qi.hpp>
#include <boost/fusion/adapted/std_pair.hpp>
namespace qi = boost::spirit::qi;
template<typename Iterator>
struct jsonparser : qi::grammar<Iterator, std::map<std::string, int>()>
{
jsonparser() : jsonparser::base_type(query, "JSON-parser")
{
using qi::char_;
using qi::int_;
using qi::blank;
using qi::eol;
using qi::omit;
query = omit[-(char_('{') >> eol)] >> pair % (eol | (',' >> eol)) >> '}';
pair = key >> -(':' >> value);
key = omit[*blank] >> '"' >> char_("a-zA-Z_") >> *char_("a-zA-Z_0-9") >> '"';
value = '"' >> int_ >> '"';
};
qi::rule<Iterator, std::map<std::string, int>()> query;
qi::rule<Iterator, std::pair<std::string, int>()> pair;
qi::rule<Iterator, std::string()> key;
qi::rule<Iterator, int()> value;
};
void main(int argc, char** argv)
{
// Copy json-example.txt right in the std::string
std::string jsonstr
(
(
std::istreambuf_iterator<char>
(
*(std::auto_ptr<std::ifstream>(new std::ifstream("json-example.txt"))).get()
)
),
std::istreambuf_iterator<char>()
);
typedef std::string::iterator StrIterator;
StrIterator iter_beg = jsonstr.begin();
StrIterator iter_end = jsonstr.end();
jsonparser<StrIterator> grammar;
std::map<std::string,int> output;
// Parse the given json file
qi::parse(iter_beg, iter_end, grammatic, output);
// Output the result
std::for_each(output.begin(), output.end(),
[](const std::pair<std::string, int> &item) -> void
{
std::cout << item.first << ":" << item.second << std::endl;
});
}
输出:
结果:1
gs:0
加:0
拉:0
磅:0
液晶:0
ld:0
例如:0
gd:0