diff --git a/JSON/include/Poco/JSON/DefaultHandler.h b/JSON/include/Poco/JSON/DefaultHandler.h index 7af26bcbb..1b9e582ce 100644 --- a/JSON/include/Poco/JSON/DefaultHandler.h +++ b/JSON/include/Poco/JSON/DefaultHandler.h @@ -92,6 +92,12 @@ public: /// An integer value is read +#if defined(POCO_HAVE_INT64) + virtual void value(Int64 v); + /// A 64-bit integer value is read +#endif + + virtual void value(const std::string& s); /// A string value is read. @@ -135,6 +141,13 @@ inline void DefaultHandler::value(int v) setValue(v); } +#if defined(POCO_HAVE_INT64) +inline void DefaultHandler::value(Int64 v) +{ + setValue(v); +} +#endif + inline void DefaultHandler::value(const std::string& s) { diff --git a/JSON/include/Poco/JSON/Handler.h b/JSON/include/Poco/JSON/Handler.h index 6b32b5855..d4bf859cc 100644 --- a/JSON/include/Poco/JSON/Handler.h +++ b/JSON/include/Poco/JSON/Handler.h @@ -30,7 +30,7 @@ // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT // SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE -// FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, +// FOR ANY DAMAGES OR OTHER LIABILITY, W#if defined(POCO_HAVE_INT64)HETHER IN CONTRACT, TORT OR OTHERWISE, // ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER // DEALINGS IN THE SOFTWARE. // @@ -78,6 +78,12 @@ public: virtual void value(int v) = 0; /// An integer value is read + + +#if defined(POCO_HAVE_INT64) + virtual void value(Int64 v) = 0; + /// A 64-bit integer value is read +#endif virtual void value(const std::string& value) = 0; diff --git a/JSON/src/Parser.cpp b/JSON/src/Parser.cpp index 3a3156e9e..e20d76ce5 100644 --- a/JSON/src/Parser.cpp +++ b/JSON/src/Parser.cpp @@ -566,7 +566,20 @@ void Parser::readValue(const Token* token) case Token::INTEGER_LITERAL_TOKEN: if ( _handler != NULL ) { - _handler->value(token->asInteger()); + int value = token->asInteger(); +#if defined(POCO_HAVE_INT64) + if ( value == std::numeric_limits::max() + || value == std::numeric_limits::min() ) + { + _handler->value(NumberParser::parse64(token->asString())); + } + else + { + _handler->value(token->asInteger()); + } +#else + _handle->value(value); +#endif } break; case Token::KEYWORD_TOKEN: