前言
最近使用rapidjson库比较多,rapidjson是一个开源的、高性能的json库,在rapidjson官方教程中,提到 :
rapidjson::Reader
以从输入流解析一个Json。当它从流中读取字符时,它会基于Json的语法去分析字符,并向处理器发送事件。
且该库提供了处理器的接口,我们只要对接口进行实现即可实现将json解析到自己想要的格式
/*接口,继承BaseReaderHandler以实现解析为自己的格式*/
template<typename Encoding = UTF8<>, typename Derived = void>
struct BaseReaderHandler {
typedef typename Encoding::Ch Ch;
typedef typename internal::SelectIf<internal::IsSame<Derived, void>, BaseReaderHandler, Derived>::Type Override;
bool Default() {
return true; }
bool Null() {
return static_cast<Override&>(*this).Default(); }
bool Bool(bool) {
return static_cast<Override&>(*this).Default(); }
bool Int(int) {
return static_cast<Override&>(*this).Default(); }
bool Uint(unsigned) {
return static_cast<Override&>(*this).Default(); }
bool Int64(int64_t) {
return static_cast<Override&>(*this).Default(); }
bool Uint64(uint64_t) {
return static_cast<Override&>(*this).Default(); }
bool Double(double) {
return static_cast<Override&>(*this).Default(); }
/// enabled via kParseNumbersAsStringsFlag, string is not null-terminated (use length)
bool RawNumber(const Ch* str, SizeType len, bool copy) {
return static_cast<Override&>(*this).String(str, len, copy); }
bool String(const Ch*, SizeType, bool) {
return static_cast<Override&>(*this).Default(); }
bool StartObject() {
return static_cast<Override&>(*this).Default(); }
bool Key(const Ch* str, SizeType len, bool copy) {
return static_cast<Override&>(*this).String(str, len, copy); }
bool EndObject(SizeType) {
return static_cast<Override&>(*this).Default(); }
bool StartArray() {
return static_cast<Override&>(*this).Default(); }
bool EndArray(SizeType) {
return static_cast<Override&>(*this).Default(); }
};
实现
我想将json字符串解析为xml的表示,因此先继承再重写相应的事件接口
namespace TestReader {
struct MyHandler
: public rapidjson::BaseReaderHandler<rapidjson::UTF8<>, MyHandler>
{
bool Null()
{