I'm trying to create a JSON array using boost property trees.
The documentation says: "JSON arrays are mapped to nodes. Each element is a child node with an empty name."
So I'd like to create a property tree with empty names, then call write_json(...)
to get the array out. However, the documentation doesn't tell me how to create unnamed child nodes. I tried ptree.add_child("", value)
, but this yields:
Assertion `!p.empty() && "Empty path not allowed for put_child."' failed
The documentation doesn't seem to address this point, at least not in any way I can figure out. Can anyone help?
What you need to do is this piece of fun. This is from memory, but something like this works for me.
But watch out there's several bugs in the json parsing and writing. Several of which I've submitted bug reports for - with no response :(
EDIT: to address concern about it serializing incorrectly as {"":"","":""}
This only happens when the array is the root element. The boost ptree writer treats all root elements as objects - never arrays or values. This is caused by the following line in boost/propert_tree/detail/json_parser_writer.hpp
Getting rid of the "indent > 0 &&" will allow it to write arrays correctly.
If you don't like how much space is produced you can use the patch I've provided here
In my case I wanted to add an array to a more or less arbitrary location, so, like Michael's answer, create a child tree and populate it with array elements:
When the child has been populated, use the
put_child()
oradd_child()
function to add the entire child tree to the target tree, like this...the put_child function takes a path and a tree for an argument and will "graft" arrayChild into targetTree
Simple Array:
results in:
Array over Objects:
results in:
hope this helps
As of
boost 1.60.0
, problem persists.Offering a
Python 3
workaround (Gist), which can be syscalled just afterboost::property_tree::write_json
.When starting to use Property Tree to represent a JSON structure I encountered similar problems which I did not resolve. Also note that from the documentation, the property tree does not fully support type information:
After learning this, I switched to the more complete JSON implementation JSON Spirit. This library uses Boost Spirit for the JSON grammar implementation and fully supports JSON including arrays.
I suggest you use an alternative C++ JSON implementation.