mirror of
https://github.com/pocoproject/poco.git
synced 2025-06-25 22:15:21 +02:00

* enh(poco): Replace deprecated comments with C++ deprecated attribute. * enh(Poco): Replace some deprecated functionality in Poco sources. (#4426) * enh(Poco): Replace more deprecated functionality in Poco sources. (#4426) * fix(CMake): Variable BUILD_SHARED_LIBS must be defined properly to create valid binaries. * enh: Code improvements done while resolving deprecated functionality (#4426) * Un-deprecate LocalDateTme (#4426) * enh(Poco): Replace usage of deprecated functionality with other functions/classes (#4426) * chore(SSL): temporarily un-deprecate SSL-related functionality (#4426) * chore(SSL): temporarily un-deprecate old MongoDB protocol functionality (#4426) * enh(Poco): Minor Hash improvements (#4426) * enh(Foundation): Compile deprecated hash tests only when POCO_TEST_DEPRECATED is enabled (#4426) * enh(Net): Compile deprecated Socket::select functionality only when POCO_TEST_DEPRECATED is enabled (#4426) * enh(Bonjour): Replace deprecated Socket::select with PollSet (#4426) * enh(Poco): Introduce POCO_DEPRECATED macro to have the ability to disable deprecation warnings in applications (#4426) * test(ODBC): add few asserts to testStoredProcedureDynamicVar * fix(ODBC): rename DynamicAny -> DynamicVar in tests * fix(ODBC): make Dignostics static members inline to prevent explicit instantiation warnings on windows --------- Co-authored-by: Alex Fabijanic <alex@pocoproject.org>
142 lines
2.3 KiB
C++
142 lines
2.3 KiB
C++
//
|
|
// ParseHandler.cpp
|
|
//
|
|
// Library: JSON
|
|
// Package: JSON
|
|
// Module: ParseHandler
|
|
//
|
|
// Copyright (c) 2012, Applied Informatics Software Engineering GmbH.
|
|
// and Contributors.
|
|
//
|
|
// SPDX-License-Identifier: BSL-1.0
|
|
//
|
|
|
|
|
|
#include "Poco/JSON/ParseHandler.h"
|
|
#include "Poco/JSON/Object.h"
|
|
#include "Poco/JSON/JSONException.h"
|
|
|
|
|
|
using Poco::Dynamic::Var;
|
|
|
|
|
|
namespace Poco {
|
|
namespace JSON {
|
|
|
|
|
|
ParseHandler::ParseHandler(bool preserveObjectOrder) : Handler(),
|
|
_preserveObjectOrder(preserveObjectOrder)
|
|
{
|
|
}
|
|
|
|
|
|
ParseHandler::~ParseHandler() = default;
|
|
|
|
|
|
void ParseHandler::reset()
|
|
{
|
|
while (!_stack.empty()) _stack.pop();
|
|
_key = "";
|
|
_result.clear();
|
|
}
|
|
|
|
|
|
void ParseHandler::startObject()
|
|
{
|
|
Object::Ptr newObj = new Object(_preserveObjectOrder);
|
|
if (_stack.empty()) // The first object
|
|
{
|
|
_result = newObj;
|
|
}
|
|
else
|
|
{
|
|
Var parent = _stack.top();
|
|
|
|
if (parent.type() == typeid(Array::Ptr))
|
|
{
|
|
Array::Ptr arr = parent.extract<Array::Ptr>();
|
|
arr->add(newObj);
|
|
}
|
|
else if (parent.type() == typeid(Object::Ptr))
|
|
{
|
|
Object::Ptr obj = parent.extract<Object::Ptr>();
|
|
obj->set(_key, newObj);
|
|
_key.clear();
|
|
}
|
|
}
|
|
|
|
_stack.emplace(newObj);
|
|
}
|
|
|
|
|
|
void ParseHandler::endObject()
|
|
{
|
|
if (!_stack.empty()) _stack.pop();
|
|
}
|
|
|
|
|
|
void ParseHandler::startArray()
|
|
{
|
|
Array::Ptr newArr = new Array();
|
|
|
|
if (_stack.empty()) // The first array
|
|
{
|
|
_result = newArr;
|
|
}
|
|
else
|
|
{
|
|
Var parent = _stack.top();
|
|
|
|
if (parent.type() == typeid(Array::Ptr))
|
|
{
|
|
Array::Ptr arr = parent.extract<Array::Ptr>();
|
|
arr->add(newArr);
|
|
}
|
|
else if (parent.type() == typeid(Object::Ptr))
|
|
{
|
|
Object::Ptr obj = parent.extract<Object::Ptr>();
|
|
obj->set(_key, newArr);
|
|
_key.clear();
|
|
}
|
|
}
|
|
|
|
_stack.emplace(newArr);
|
|
}
|
|
|
|
|
|
void ParseHandler::endArray()
|
|
{
|
|
if (!_stack.empty()) _stack.pop();
|
|
}
|
|
|
|
|
|
void ParseHandler::key(const std::string& k)
|
|
{
|
|
_key = k;
|
|
}
|
|
|
|
|
|
void ParseHandler::setValue(const Var& value)
|
|
{
|
|
if (!_stack.empty())
|
|
{
|
|
Var parent = _stack.top();
|
|
|
|
if (parent.type() == typeid(Array::Ptr))
|
|
{
|
|
Array::Ptr arr = parent.extract<Array::Ptr>();
|
|
arr->add(value);
|
|
}
|
|
else if (parent.type() == typeid(Object::Ptr))
|
|
{
|
|
Object::Ptr obj = parent.extract<Object::Ptr>();
|
|
obj->set(_key, value);
|
|
_key.clear();
|
|
}
|
|
}
|
|
else throw JSONException("Attempt to set value on an empty stack");
|
|
}
|
|
|
|
|
|
} } // namespace Poco::JSON
|