forked from pocoproject/poco
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathQuery.h
More file actions
132 lines (112 loc) · 4.44 KB
/
Query.h
File metadata and controls
132 lines (112 loc) · 4.44 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
//
// Query.h
//
// $Id$
//
// Library: JSON
// Package: JSON
// Module: Query
//
// Definition of the Query class.
//
// 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.
//
#ifndef JSON_JSONQuery_INCLUDED
#define JSON_JSONQuery_INCLUDED
#include "Poco/JSON/JSON.h"
#include "Poco/JSON/Object.h"
#include "Poco/JSON/Array.h"
namespace Poco {
namespace JSON {
class JSON_API Query
/// Class that can be used to search for a value in a JSON object or array.
{
public:
Query(const Dynamic::Var& source);
/// Creates the Query; source must be JSON Object, Array, Object::Ptr,
/// Array::Ptr or empty Var. Any other type will trigger throwing of
/// InvalidArgumentException.
/// Creating Query holding Ptr will typically result in faster
/// performance.
virtual ~Query();
/// Destructor
Object::Ptr findObject(const std::string& path) const;
/// Search for an object. When the object can't be found, a zero Ptr
/// is returned; otherwise, a shared pointer to internally held object
/// is returned.
/// If object (as opposed to a pointer to object) is held
/// internally, a shared pointer to new (heap-allocated) Object is
/// returned; this may be expensive operation.
Object& findObject(const std::string& path, Object& obj) const;
/// Search for an object. If object is found, it is assigned to the
/// Object through the reference passed in. When the object can't be
/// found, the provided Object is emptied and returned.
Array::Ptr findArray(const std::string& path) const;
/// Search for an array. When the array can't be found, a zero Ptr
/// is returned; otherwise, a shared pointer to internally held array
/// is returned.
/// If array (as opposed to a pointer to array) is held
/// internally, a shared pointer to new (heap-allocated) Object is
/// returned; this may be expensive operation.
Array& findArray(const std::string& path, Array& obj) const;
/// Search for an array. If array is found, it is assigned to the
/// Object through the reference passed in. When the array can't be
/// found, the provided Object is emptied and returned.
Dynamic::Var find(const std::string& path) const;
/// Searches a value
/// For example: "person.children[0].name" will return the
/// the name of the first child. When the value can't be found
/// an empty value is returned.
template<typename T>
T findValue(const std::string& path, const T& def) const
/// Searches for a value will convert it to the given type.
/// When the value can't be found or has an invalid type
/// the default value will be returned.
{
T result = def;
Dynamic::Var value = find(path);
if ( ! value.isEmpty() )
{
try
{
result = value.convert<T>();
}
catch(...) { }
}
return result;
}
std::string findValue(const char* path, const char* def) const
/// Searches for a value will convert it to the given type.
/// When the value can't be found or has an invalid type
/// the default value will be returned.
{
return findValue<std::string>(path, def);
}
private:
Dynamic::Var _source;
};
}} // namespace Poco::JSON
#endif // JSON_JSONQuery_INCLUDED