mirror of
https://github.com/pocoproject/poco.git
synced 2025-01-02 06:35:05 +01:00
5e6ef1c14d
- fixed GH #99: JSON::Query an JSON::Object - swapped order of AnyCast(const Any&) and AnyCast(Any&) definitions
233 lines
4.6 KiB
C++
233 lines
4.6 KiB
C++
//
|
|
// Array.cpp
|
|
//
|
|
// $Id$
|
|
//
|
|
// Library: JSON
|
|
// Package: JSON
|
|
// Module: Array
|
|
//
|
|
// Copyright (c) 2012, Applied Informatics Software Engineering GmbH.
|
|
// and Contributors.
|
|
//
|
|
// Permission is hereby granted, free of charge, to any person or organization
|
|
// obtaining a copy of the software and accompanying documentation covered by
|
|
// this license (the "Software") to use, reproduce, display, distribute,
|
|
// execute, and transmit the Software, and to prepare derivative works of the
|
|
// Software, and to permit third-parties to whom the Software is furnished to
|
|
// do so, all subject to the following:
|
|
//
|
|
// The copyright notices in the Software and this entire statement, including
|
|
// the above license grant, this restriction and the following disclaimer,
|
|
// must be included in all copies of the Software, in whole or in part, and
|
|
// all derivative works of the Software, unless such copies or derivative
|
|
// works are solely in the form of machine-executable object code generated by
|
|
// a source language processor.
|
|
//
|
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
// 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,
|
|
// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
|
// DEALINGS IN THE SOFTWARE.
|
|
//
|
|
|
|
|
|
#include "Poco/JSON/Array.h"
|
|
#include "Poco/JSON/Object.h"
|
|
#include "Poco/JSON/Stringifier.h"
|
|
|
|
|
|
using Poco::Dynamic::Var;
|
|
|
|
|
|
namespace Poco {
|
|
namespace JSON {
|
|
|
|
|
|
Array::Array()
|
|
{
|
|
}
|
|
|
|
|
|
Array::Array(const Array& copy) : _values(copy._values)
|
|
{
|
|
}
|
|
|
|
|
|
Array::~Array()
|
|
{
|
|
}
|
|
|
|
|
|
Var Array::get(unsigned int index) const
|
|
{
|
|
Var value;
|
|
try
|
|
{
|
|
value = _values.at(index);
|
|
}
|
|
catch(std::out_of_range&)
|
|
{
|
|
//Ignore, we return an empty value
|
|
}
|
|
return value;
|
|
}
|
|
|
|
|
|
Array::Ptr Array::getArray(unsigned int index) const
|
|
{
|
|
Array::Ptr result;
|
|
|
|
Var value = get(index);
|
|
if ( value.type() == typeid(Array::Ptr) )
|
|
{
|
|
result = value.extract<Array::Ptr>();
|
|
}
|
|
return result;
|
|
}
|
|
|
|
|
|
Object::Ptr Array::getObject(unsigned int index) const
|
|
{
|
|
Object::Ptr result;
|
|
|
|
Var value = get(index);
|
|
if ( value.type() == typeid(Object::Ptr) )
|
|
{
|
|
result = value.extract<Object::Ptr>();
|
|
}
|
|
return result;
|
|
}
|
|
|
|
|
|
bool Array::isNull(unsigned int index) const
|
|
{
|
|
if ( index < _values.size() )
|
|
{
|
|
Dynamic::Var value = _values[index];
|
|
return value.isEmpty();
|
|
}
|
|
return true;
|
|
}
|
|
|
|
|
|
bool Array::isObject(unsigned int index) const
|
|
{
|
|
Var value = get(index);
|
|
return isObject(value);
|
|
}
|
|
|
|
|
|
bool Array::isObject(const Dynamic::Var& value) const
|
|
{
|
|
return value.type() == typeid(Object::Ptr);
|
|
}
|
|
|
|
|
|
bool Array::isObject(ConstIterator& it) const
|
|
{
|
|
return it!= end() && isObject(*it);
|
|
}
|
|
|
|
|
|
void Array::stringify(std::ostream& out, unsigned int indent, int step) const
|
|
{
|
|
if (step == -1) step = indent;
|
|
|
|
out << "[";
|
|
|
|
if (indent > 0) out << std::endl;
|
|
|
|
for (ValueVec::const_iterator it = _values.begin(); it != _values.end();)
|
|
{
|
|
for(int i = 0; i < indent; i++) out << ' ';
|
|
|
|
Stringifier::stringify(*it, out, indent + step, step);
|
|
|
|
if ( ++it != _values.end() )
|
|
{
|
|
out << ",";
|
|
if (step > 0) out << '\n';
|
|
}
|
|
}
|
|
|
|
if (step > 0) out << '\n';
|
|
|
|
if (indent >= step) indent -= step;
|
|
|
|
for (int i = 0; i < indent; i++)
|
|
out << ' ';
|
|
|
|
out << "]";
|
|
}
|
|
|
|
|
|
Array::operator const Poco::Dynamic::Array& () const
|
|
{
|
|
if (!_pArray)
|
|
{
|
|
ValueVec::const_iterator it = _values.begin();
|
|
ValueVec::const_iterator end = _values.end();
|
|
_pArray = new Poco::Dynamic::Array;
|
|
int index = 0;
|
|
for (; it != end; ++it, ++index)
|
|
{
|
|
if (isObject(it))
|
|
{
|
|
_pArray->insert(_pArray->end(), Poco::JSON::Object::makeStruct(getObject(index)));
|
|
}
|
|
else if (isArray(it))
|
|
{
|
|
_pArray->insert(_pArray->end(), makeArray(getArray(index)));
|
|
}
|
|
else
|
|
{
|
|
_pArray->insert(_pArray->end(), *it);
|
|
}
|
|
}
|
|
}
|
|
|
|
return *_pArray;
|
|
}
|
|
|
|
|
|
Poco::Dynamic::Array Array::makeArray(const JSON::Array::Ptr& arr)
|
|
{
|
|
Poco::Dynamic::Array vec;
|
|
|
|
JSON::Array::ConstIterator it = arr->begin();
|
|
JSON::Array::ConstIterator end = arr->end();
|
|
int index = 0;
|
|
for (; it != end; ++it, ++index)
|
|
{
|
|
if (arr->isObject(it))
|
|
{
|
|
Object::Ptr pObj = arr->getObject(index);
|
|
DynamicStruct str = Poco::JSON::Object::makeStruct(pObj);
|
|
vec.insert(vec.end(), str);
|
|
}
|
|
else if (arr->isArray(it))
|
|
{
|
|
Array::Ptr pArr = arr->getArray(index);
|
|
std::vector<Poco::Dynamic::Var> v = makeArray(pArr);
|
|
vec.insert(vec.end(), v);
|
|
}
|
|
else
|
|
vec.insert(vec.end(), *it);
|
|
}
|
|
|
|
return vec;
|
|
}
|
|
|
|
|
|
void Array::clear()
|
|
{
|
|
_values.clear();
|
|
_pArray = 0;
|
|
}
|
|
|
|
|
|
} } // namespace Poco::JSON
|