1
0
mirror of https://github.com/VCMP-SqMod/SqMod.git synced 2025-02-23 13:17:14 +01:00
2021-08-22 18:07:06 +03:00

216 lines
4.7 KiB
C++

//
// Parser.h
//
// Library: JSON
// Package: JSON
// Module: Parser
//
// Definition of the Parser class.
//
// Copyright (c) 2012, Applied Informatics Software Engineering GmbH.
// and Contributors.
//
// SPDX-License-Identifier: BSL-1.0
//
#ifndef JSON_JSONParser_INCLUDED
#define JSON_JSONParser_INCLUDED
#include "Poco/JSON/JSON.h"
#include "Poco/JSON/ParserImpl.h"
#include "Poco/JSON/Object.h"
#include "Poco/JSON/Array.h"
#include "Poco/JSON/ParseHandler.h"
#include "Poco/JSON/JSONException.h"
#include "Poco/UTF8Encoding.h"
#include "Poco/Dynamic/Var.h"
#include <string>
namespace Poco {
namespace JSON {
class JSON_API Parser: private ParserImpl
/// A parser for reading RFC 4627 compliant JSON from strings or streams.
///
/// Simple usage example:
///
/// std::string json = "{ \"name\" : \"Franky\", \"children\" : [ \"Jonas\", \"Ellen\" ] }";
/// Parser parser;
/// Var result = parser.parse(json);
/// // ... use result (see next example)
/// parser.reset();
/// std::ostringstream ostr;
/// PrintHandler::Ptr pHandler = new PrintHandler(ostr);
/// parser.setHandler(pHandler);
/// parser.parse(json); // ostr.str() == json
/// ----
///
/// The result of parsing a valid JSON document will be either an Object
/// or an Array. Therefore the result of parse() is a Poco::Dynamic::Var
/// containing a Poco::SharedPtr to an Object or Array instance.
///
/// Example:
///
/// std::string json = "{ \"name\" : \"Franky\", \"children\" : [ \"Jonas\", \"Ellen\" ] }";
/// Parser parser;
/// Var result = parser.parse(json);
/// Object::Ptr pObject = result.extract<Object::Ptr>();
/// std::string name = pObject->getValue<std::string>("name");
/// Array::Ptr pChildren = pObject->getArray("children");
/// ----
{
public:
Parser(const Handler::Ptr& pHandler = new ParseHandler);
/// Creates JSON Parser, using the given Handler and buffer size.
virtual ~Parser();
/// Destroys JSON Parser.
void reset();
/// Resets the parser.
void setAllowComments(bool comments);
/// Allow or disallow comments. By default, comments are not allowed.
///
/// If set to true, comments will be filtered out of the input data
/// before passing the JSON on to the parser. This will impact performance,
/// especially when reading from a std::istream.
bool getAllowComments() const;
/// Returns true if comments are allowed, false otherwise.
///
/// By default, comments are not allowed.
void setAllowNullByte(bool nullByte);
/// Allow or disallow null byte in strings.
///
/// By default, null byte is allowed (true).
///
/// If set to false, an additional check for "\u0000" will be performed
/// before passing the JSON on to the parser. This will impact performance,
/// especially when reading from a std::istream.
bool getAllowNullByte() const;
/// Returns true if null byte is allowed, false otherwise.
///
/// By default, null bytes are allowed.
void setDepth(std::size_t depth);
/// Sets the allowed JSON depth.
///
/// Default maximum depth is 128. Setting this value too high
/// may result in a stack overflow when parsing a (malicious)
/// JSON document.
std::size_t getDepth() const;
/// Returns the allowed JSON depth.
Dynamic::Var parse(const std::string& json);
/// Parses JSON from a string.
Dynamic::Var parse(std::istream& in);
/// Parses JSON from an input stream.
void setHandler(const Handler::Ptr& pHandler);
/// Set the Handler.
const Handler::Ptr& getHandler();
/// Returns the Handler.
Dynamic::Var asVar() const;
/// Returns the result of parsing;
Dynamic::Var result() const;
/// Returns the result of parsing as Dynamic::Var;
private:
Parser(const Parser&);
Parser& operator = (const Parser&);
};
//
// inlines
//
inline void Parser::setAllowComments(bool comments)
{
setAllowCommentsImpl(comments);
}
inline bool Parser::getAllowComments() const
{
return getAllowCommentsImpl();
}
inline void Parser::setAllowNullByte(bool nullByte)
{
setAllowNullByteImpl(nullByte);
}
inline bool Parser::getAllowNullByte() const
{
return getAllowNullByteImpl();
}
inline void Parser::setDepth(std::size_t depth)
{
setDepthImpl(depth);
}
inline std::size_t Parser::getDepth() const
{
return getDepthImpl();
}
inline const Handler::Ptr& Parser::getHandler()
{
return getHandlerImpl();
}
inline Dynamic::Var Parser::result() const
{
return resultImpl();
}
inline Dynamic::Var Parser::asVar() const
{
return asVarImpl();
}
inline void Parser::reset()
{
resetImpl();
}
inline Dynamic::Var Parser::parse(const std::string& json)
{
return parseImpl(json);
}
inline Dynamic::Var Parser::parse(std::istream& in)
{
return parseImpl(in);
}
} } // namespace Poco::JSON
#endif // JSON_JSONParser_INCLUDED