2012-04-29 20:09:55 +00:00
|
|
|
//
|
2013-03-16 11:33:27 -05:00
|
|
|
// ParseHandler.cpp
|
2012-04-29 20:09:55 +00:00
|
|
|
//
|
|
|
|
// Library: JSON
|
|
|
|
// Package: JSON
|
2013-03-16 11:33:27 -05:00
|
|
|
// Module: ParseHandler
|
2012-04-29 20:09:55 +00:00
|
|
|
//
|
|
|
|
// Copyright (c) 2012, Applied Informatics Software Engineering GmbH.
|
|
|
|
// and Contributors.
|
|
|
|
//
|
2014-05-04 21:02:42 +02:00
|
|
|
// SPDX-License-Identifier: BSL-1.0
|
2012-04-29 20:09:55 +00:00
|
|
|
//
|
|
|
|
|
2012-10-15 12:27:56 +00:00
|
|
|
|
2013-03-16 11:33:27 -05:00
|
|
|
#include "Poco/JSON/ParseHandler.h"
|
2012-04-29 20:09:55 +00:00
|
|
|
#include "Poco/JSON/Object.h"
|
2017-09-25 15:15:05 -05:00
|
|
|
#include "Poco/JSON/JSONException.h"
|
2012-04-29 20:09:55 +00:00
|
|
|
|
2012-09-24 03:51:40 +00:00
|
|
|
|
|
|
|
using Poco::Dynamic::Var;
|
|
|
|
|
|
|
|
|
|
|
|
namespace Poco {
|
|
|
|
namespace JSON {
|
|
|
|
|
2012-04-29 20:09:55 +00:00
|
|
|
|
2013-03-16 11:33:27 -05:00
|
|
|
ParseHandler::ParseHandler(bool preserveObjectOrder) : Handler(),
|
|
|
|
_preserveObjectOrder(preserveObjectOrder)
|
2012-04-29 20:09:55 +00:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2012-09-24 03:51:40 +00:00
|
|
|
|
2013-03-16 11:33:27 -05:00
|
|
|
ParseHandler::~ParseHandler()
|
2012-04-29 20:09:55 +00:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2013-05-27 21:00:14 -05:00
|
|
|
void ParseHandler::reset()
|
|
|
|
{
|
|
|
|
while (!_stack.empty()) _stack.pop();
|
|
|
|
_key = "";
|
|
|
|
_result.empty();
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2013-03-16 11:33:27 -05:00
|
|
|
void ParseHandler::startObject()
|
2012-04-29 20:09:55 +00:00
|
|
|
{
|
2013-03-16 11:33:27 -05:00
|
|
|
Object::Ptr newObj = new Object(_preserveObjectOrder);
|
2017-02-13 22:33:48 +01:00
|
|
|
if (_stack.empty()) // The first object
|
2012-04-29 20:09:55 +00:00
|
|
|
{
|
|
|
|
_result = newObj;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2012-09-24 03:51:40 +00:00
|
|
|
Var parent = _stack.top();
|
2012-04-29 20:09:55 +00:00
|
|
|
|
2017-02-13 22:33:48 +01:00
|
|
|
if (parent.type() == typeid(Array::Ptr))
|
2012-04-29 20:09:55 +00:00
|
|
|
{
|
|
|
|
Array::Ptr arr = parent.extract<Array::Ptr>();
|
|
|
|
arr->add(newObj);
|
|
|
|
}
|
2017-02-13 22:33:48 +01:00
|
|
|
else if (parent.type() == typeid(Object::Ptr))
|
2012-04-29 20:09:55 +00:00
|
|
|
{
|
|
|
|
poco_assert_dbg(!_key.empty());
|
|
|
|
Object::Ptr obj = parent.extract<Object::Ptr>();
|
|
|
|
obj->set(_key, newObj);
|
|
|
|
_key.clear();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
_stack.push(newObj);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2013-03-16 11:33:27 -05:00
|
|
|
void ParseHandler::endObject()
|
2012-04-29 20:09:55 +00:00
|
|
|
{
|
2014-04-29 21:25:30 -05:00
|
|
|
if (!_stack.empty()) _stack.pop();
|
2012-04-29 20:09:55 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2013-03-16 11:33:27 -05:00
|
|
|
void ParseHandler::startArray()
|
2012-04-29 20:09:55 +00:00
|
|
|
{
|
|
|
|
Array::Ptr newArr = new Array();
|
|
|
|
|
2017-02-13 22:33:48 +01:00
|
|
|
if (_stack.empty()) // The first array
|
2012-04-29 20:09:55 +00:00
|
|
|
{
|
|
|
|
_result = newArr;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2012-09-24 03:51:40 +00:00
|
|
|
Var parent = _stack.top();
|
2012-04-29 20:09:55 +00:00
|
|
|
|
2017-02-13 22:33:48 +01:00
|
|
|
if (parent.type() == typeid(Array::Ptr))
|
2012-04-29 20:09:55 +00:00
|
|
|
{
|
|
|
|
Array::Ptr arr = parent.extract<Array::Ptr>();
|
|
|
|
arr->add(newArr);
|
|
|
|
}
|
2017-02-13 22:33:48 +01:00
|
|
|
else if (parent.type() == typeid(Object::Ptr))
|
2012-04-29 20:09:55 +00:00
|
|
|
{
|
|
|
|
poco_assert_dbg(!_key.empty());
|
|
|
|
Object::Ptr obj = parent.extract<Object::Ptr>();
|
|
|
|
obj->set(_key, newArr);
|
|
|
|
_key.clear();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
_stack.push(newArr);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2013-03-16 11:33:27 -05:00
|
|
|
void ParseHandler::endArray()
|
2012-04-29 20:09:55 +00:00
|
|
|
{
|
2014-04-29 21:25:30 -05:00
|
|
|
if (!_stack.empty()) _stack.pop();
|
2012-04-29 20:09:55 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2013-03-16 11:33:27 -05:00
|
|
|
void ParseHandler::key(const std::string& k)
|
2012-04-29 20:09:55 +00:00
|
|
|
{
|
|
|
|
_key = k;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2013-03-16 11:33:27 -05:00
|
|
|
void ParseHandler::setValue(const Var& value)
|
2012-04-29 20:09:55 +00:00
|
|
|
{
|
2017-09-25 15:15:05 -05:00
|
|
|
if (_stack.size())
|
2012-04-29 20:09:55 +00:00
|
|
|
{
|
2017-09-25 15:15:05 -05:00
|
|
|
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();
|
|
|
|
}
|
2012-04-29 20:09:55 +00:00
|
|
|
}
|
2017-09-25 15:15:05 -05:00
|
|
|
else
|
2012-04-29 20:09:55 +00:00
|
|
|
{
|
2017-09-25 15:15:05 -05:00
|
|
|
throw JSONException("Attempt to set value on an empty stack");
|
2012-04-29 20:09:55 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2012-10-15 12:27:56 +00:00
|
|
|
} } // namespace Poco::JSON
|