Added removeMember() and altered a few comments.
diff --git a/include/json/value.h b/include/json/value.h
index 376b495..2453cb1 100644
--- a/include/json/value.h
+++ b/include/json/value.h
@@ -270,9 +270,10 @@
/// otherwise returns defaultValue.
Value get( UInt index,
const Value &defaultValue ) const;
- /// Returns true if index < size().
+ /// Return true if index < size().
bool isValidIndex( UInt index ) const;
- /// Append value to array at the end.
+ /// \brief Append value to array at the end.
+ ///
/// Equivalent to jsonvalue[jsonvalue.size()] = value;
Value &append( const Value &value );
@@ -302,27 +303,41 @@
/// Access an object value by name, returns null if there is no member with that name.
const Value &operator[]( const CppTL::ConstString &key ) const;
# endif
- /// Returns the member named key if it exist, defaultValue otherwise.
+ /// Return the member named key if it exist, defaultValue otherwise.
Value get( const char *key,
const Value &defaultValue ) const;
- /// Returns the member named key if it exist, defaultValue otherwise.
+ /// Return the member named key if it exist, defaultValue otherwise.
Value get( const std::string &key,
const Value &defaultValue ) const;
# ifdef JSON_USE_CPPTL
- /// Returns the member named key if it exist, defaultValue otherwise.
+ /// Return the member named key if it exist, defaultValue otherwise.
Value get( const CppTL::ConstString &key,
const Value &defaultValue ) const;
# endif
- /// Returns true if the object has a member named key.
+ /// \brief Remove and return the named member.
+ ///
+ /// Do nothing if it did not exist.
+ /// \return the removed Value, or null.
+ /// \pre type() is objectValue or nullValue
+ /// \post type() is unchanged
+ Value removeMember( const char* key );
+ /// Same as removeMember(const char*)
+ Value removeMember( const std::string &key );
+
+ /// Return true if the object has a member named key.
bool isMember( const char *key ) const;
- /// Returns true if the object has a member named key.
+ /// Return true if the object has a member named key.
bool isMember( const std::string &key ) const;
# ifdef JSON_USE_CPPTL
- /// Returns true if the object has a member named key.
+ /// Return true if the object has a member named key.
bool isMember( const CppTL::ConstString &key ) const;
# endif
- // Returns a list of the member names.
+ /// \brief Return a list of the member names.
+ ///
+ /// If null, return an empty list.
+ /// \pre type() is objectValue or nullValue
+ /// \post if type() was nullValue, it remains nullValue
Members getMemberNames() const;
//# ifdef JSON_USE_CPPTL
@@ -337,6 +352,7 @@
void setComment( const std::string &comment,
CommentPlacement placement );
bool hasComment( CommentPlacement placement ) const;
+ /// Include delimiters and embedded newlines.
std::string getComment( CommentPlacement placement ) const;
std::string toStyledString() const;
@@ -864,13 +880,13 @@
return computeDistance( other );
}
- /// Returns either the index or the member name of the referenced value as a Value.
+ /// Return either the index or the member name of the referenced value as a Value.
Value key() const;
- /// Returns the index of the referenced Value. -1 if it is not an arrayValue.
+ /// Return the index of the referenced Value. -1 if it is not an arrayValue.
Value::UInt index() const;
- /// Returns the member name of the referenced Value. "" if it is not an objectValue.
+ /// Return the member name of the referenced Value. "" if it is not an objectValue.
const char *memberName() const;
protected:
diff --git a/src/lib_json/json_value.cpp b/src/lib_json/json_value.cpp
index e93e346..5fbbe13 100644
--- a/src/lib_json/json_value.cpp
+++ b/src/lib_json/json_value.cpp
@@ -1103,6 +1103,37 @@
return get( key.c_str(), defaultValue );
}
+Value
+Value::removeMember( const char* key )
+{
+ JSON_ASSERT( type_ == nullValue || type_ == objectValue );
+ if ( type_ == nullValue )
+ return null;
+#ifndef JSON_VALUE_USE_INTERNAL_MAP
+ CZString actualKey( key, CZString::noDuplication );
+ ObjectValues::iterator it = value_.map_->find( actualKey );
+ if ( it == value_.map_->end() )
+ return null;
+ Value old(it->second);
+ value_.map_->erase(it);
+ return old;
+#else
+ Value *value = value_.map_->find( key );
+ if (value){
+ Value old(*value);
+ value_.map_.remove( key );
+ return old;
+ } else {
+ return null;
+ }
+#endif
+}
+
+Value
+Value::removeMember( const std::string &key )
+{
+ return removeMember( key.c_str() );
+}
# ifdef JSON_USE_CPPTL
Value
@@ -1140,6 +1171,8 @@
Value::getMemberNames() const
{
JSON_ASSERT( type_ == nullValue || type_ == objectValue );
+ if ( type_ == nullValue )
+ return Value::Members();
Members members;
members.reserve( value_.map_->size() );
#ifndef JSON_VALUE_USE_INTERNAL_MAP