Made it possible to drop null placeholders from array output.
This can be used when it's clear that the consumer is able to deal with
this, as web browsers are. Thanks to Yatin Chawathe for the patch.
diff --git a/include/json/writer.h b/include/json/writer.h
index 38d41e1..46d5ccc 100644
--- a/include/json/writer.h
+++ b/include/json/writer.h
@@ -40,6 +40,13 @@
void enableYAMLCompatibility();
+ /** \brief Drop the "null" string from the writer's output for nullValues.
+ * Strictly speaking, this is not valid JSON. But when the output is being
+ * fed to a browser's Javascript, it makes for smaller output and the
+ * browser can handle the output just fine.
+ */
+ void dropNullPlaceholders();
+
public: // overridden from Writer
virtual std::string write( const Value &root );
@@ -48,6 +55,7 @@
std::string document_;
bool yamlCompatiblityEnabled_;
+ bool dropNullPlaceholders_;
};
/** \brief Writes a Value in <a HREF="http://www.json.org">JSON</a> format in a human friendly way.
diff --git a/src/lib_json/json_writer.cpp b/src/lib_json/json_writer.cpp
index b44def3..ccf323a 100644
--- a/src/lib_json/json_writer.cpp
+++ b/src/lib_json/json_writer.cpp
@@ -192,7 +192,8 @@
// //////////////////////////////////////////////////////////////////
FastWriter::FastWriter()
- : yamlCompatiblityEnabled_( false )
+ : yamlCompatiblityEnabled_( false ),
+ dropNullPlaceholders_( false )
{
}
@@ -204,6 +205,13 @@
}
+void
+FastWriter::dropNullPlaceholders()
+{
+ dropNullPlaceholders_ = true;
+}
+
+
std::string
FastWriter::write( const Value &root )
{
@@ -220,7 +228,7 @@
switch ( value.type() )
{
case nullValue:
- document_ += "null";
+ if (!dropNullPlaceholders_) document_ += "null";
break;
case intValue:
document_ += valueToString( value.asLargestInt() );
diff --git a/src/test_lib_json/main.cpp b/src/test_lib_json/main.cpp
index c6ab619..3e28085 100644
--- a/src/test_lib_json/main.cpp
+++ b/src/test_lib_json/main.cpp
@@ -1399,6 +1399,23 @@
JSONTEST_ASSERT( y.compare( x ) == 0 );
}
+
+struct WriterTest : JsonTest::TestCase
+{
+};
+
+
+JSONTEST_FIXTURE( WriterTest, dropNullPlaceholders )
+{
+ Json::FastWriter writer;
+ Json::Value nullValue;
+ JSONTEST_ASSERT( writer.write(nullValue) == "null\n" );
+
+ writer.dropNullPlaceholders();
+ JSONTEST_ASSERT( writer.write(nullValue) == "\n" );
+}
+
+
int main( int argc, const char *argv[] )
{
JsonTest::Runner runner;
@@ -1420,5 +1437,6 @@
JSONTEST_REGISTER_FIXTURE( runner, ValueTest, compareArray );
JSONTEST_REGISTER_FIXTURE( runner, ValueTest, compareObject );
JSONTEST_REGISTER_FIXTURE( runner, ValueTest, compareType );
+ JSONTEST_REGISTER_FIXTURE( runner, WriterTest, dropNullPlaceholders );
return runner.runCommandLine( argc, argv );
}